2011-02-08 4 views
0

커스텀 로그인 스크립트를 만들었고 잘 작동합니다. 그러나 홈페이지로 리디렉션 된 후 $ _SESSION [ 'username'] 값은 'root'로 변경됩니다. 어느 '루트'내 데이터베이스 로그인에 대한 사용자 이름입니다.PHP 세션 값이 페이지에서 페이지로 변경됩니다.

나는 손이있는 모든 입력 할 필요가, 그래서 그것은 명백한 오류가 있거나

main_login.php (모든 페이지에 포함되어 sidebar.php에 PHP는 include_once 문)

<?php 
    if(!isset ($_SESSION["username"])){ 
?> 

<!-- Simple login form action="checklogin.php" method="post"--> 

<?php 
}else{ 
?> 

<!-- Table to display welcome user, and logout link --> 
을 두살 수

checklogin.php :

session_start(); 
$db_name = "database"; 
$tbl_name = "users"; 

mysql_connect("localhost","root","password") or die("Cannot connect to SQL server"); 
mysql_select_db("$db_name")or die("Cannot select database."); 

$username = $_POST['username']; 
$password = $_POST['password']; 

$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 
$password = md5($password); 

$sql = "SELECT * FROM $tbl_name WHERE username = '$username' and password = '$password'"; 
$result = mysql_query($sql); 

$count = mysql_num_rows($result); 

if($count == 1){ 
$_SESSION["username"] = $username; 
$_SESSION["password"] = $password; 
header("location:login_success.php"); 
} 
else{ 
echo "<script type='text/javascript'>\n"; 
echo "setTimeout('redirect();',2000);\n"; 
echo "function redirect(){\n"; 
echo "window.location = 'index.php';\n"; 
echo "}\n"; 
echo "</script>\n"; 
echo "Wrong Username or Password"; 

login_success.php :

<?php 
session_start(); 
if(!isset($_SESSION['username'])){ 
header("location:index.php"); 
}else{ 
session_regenerate_id(); 
} 
// Apply permissions - problem existed before all of this code 

mysql_connect("localhost","root","password") or die("Cannot connect to database."); 
mysql_select_db("database") or die("Cannot select database."); 

$username = $_SESSION['username']; 

$query = "SELECT * FROM users WHERE username = '$username'"; 
$result = mysql_num_rows($result); 

mysql_close(); 

$_SESSION['username'] = mysql_result($result,0,'username'); 
$_SESSION['permissions'] = mysql_result($result,0,'permissions'); 
?> 

<html> 
<head> 
<script type="text/javascripnt"> 
setTimeout("redirect();",4000); 
function redirect(){ 
window.location = "index.php"; 
} 
</script> 
</head> 
<body> 
Login Successful. 
<?php echo "Welcome ".$_SESSION["username"]."."; 
var_dump($_SESSION); // var_dump reveals that $_SESSION['username'] is still the login name. 
?> 
</body> 
</html> 

모든 과정을 거치면 모든 것이 잘됩니다. 그러나 index.php로 리다이렉트하면 $ _SESSION [ 'username']은 이제 'root'가됩니다.

나는 왜 그런 일이 일어날 지 모르는 사람이 있는지 (나는 그 문제를 이해하고 미래에 그것을 막을 수 있음), 구현할 수정 사항을 물어볼 것입니다.

모두에게 감사드립니다.

+2

md5-hash를 생성하기 때문에 암호를 제거하고 mysql_real_escape를 제거 할 필요가 없습니다. 당신의 솔루션으로 stripslash 나 mysql_real_escape가 바뀌면 로그인이 깨질 수 있습니다 – Fender

+0

펜더에게 감사드립니다. 나는 그것을 바꿀 것입니다. 이것은 PHP에서의 첫 번째 시도입니다 ... 결코 추측 할 수 없었을 것입니다. – Christopher

+0

코드의 오류가 수정되지 않았습니다. 비록 내가 더 많은 담당자를 가지고있다해도, 나는 당신에게 분명히 사용되는 훌륭한 정보를 +1 해줄 것이다. 다들 감사 해요!! – Christopher

답변

0

대답은 매우 간단합니다 : '루트'에 $ _SESSION [ '이름'] 값을 변경 응용 프로그램의 일부 코드가 있습니다

.

코드를 조사하고 그 장소를 찾아야합니다. 아니 큰 문제

+0

변수 이름 $ dbusername에 "root"가 포함 된 모든 쿼리를 변경하거나 사용자 이름을 mysql_connect에 직접 삽입합니다. 4 페이지 모두 (index.php가 포함되어 있기 때문에 변경이 발생한 곳)에는 변수가 변경되었음을 나타내는 것이 없습니다. – Christopher

+0

@Christopher보세요, 단순한 논리입니다. PHP도 세션도 mysql도 변수를 변경하지 않습니다. 그것은 당신이 작성한 코드입니다. 그것을 디버그하고 문제를 찾아야합니다. 아무도 없습니다. –

+0

..... 나는 올바른 방법으로 당신에게 답을 주어야 할 것입니다. 나는 header.php (모든 페이지에 포함되어 있음)가 $ username 변수를 가지고있어 MySQL에 연결하는 것을 보았다. 나는 그것을 바꿨다. 그러나, 나는 $ _SESSION global을위한 페이지를 찾았지만 아무것도 찾지 못했다. 그러나 나는 검색 기능을 사용해도 무엇이든 찾을 수있는 코드를 쏟아 부었다. 간단한 변수가 그 원인이 될 수 있습니까? – Christopher

2

이 부분은 이상한 것 같다

$query = "SELECT * FROM users WHERE username = '$username'"; 
$result = mysql_num_rows($result); 

mysql_close(); 

$_SESSION['username'] = mysql_result($result,0,'username'); 
$_SESSION['permissions'] = mysql_result($result,0,'permissions'); 

이 시도 :

$query = "SELECT * FROM users WHERE username = '$username'"; 
$result = mysql_query($result); 


$_SESSION['username'] = mysql_result($result,0,'username'); 
$_SESSION['permissions'] = mysql_result($result,0,'permissions'); 
msql_close(); 
+0

아니요, 두 번째 매개 변수는 행을 나타냅니다. 'username'과'permissions'는 컬럼입니다. –

+0

@Felix Kling ok, 나는 그것을 바꾼다 – Fender

1

을 왜 당신 login_success.php에 다시 $ _SESSION [ '이름'] 변수를 설정하는 ' check_login.php에 변수를 다시 설정 했습니까? 여기

내가 세드릭 볼 login_success.php 프린트 아웃 세션 변수에

을 할 것 인 것이다. 나는 거의 당신의 SQL 쿼리와 함께 뭔가 일어나고 있습니다. 실제로 결과를 얻으려는 조건을 설정하십시오. 문 [ '이름']가 설정뿐 아니라 경우, 내가는 isset 멀리하려고() $ _SESSION의 실제 변수를 찾을 경우

print_r($_SESSION); 

if(!$_SESSION['username']) die('no session user name'); 

$query = "SELECT * FROM users WHERE username = '$username'"; 
$result = mysql_query($result); 

if(mysql_num_rows($result) == 1){ 
    $_SESSION['username'] = mysql_result($result,0,'username'); //why do you need this? 
    $_SESSION['permissions'] = mysql_result($result,0,'permissions'); 
    mysql_close(); 
} 
else die('no user found'); 

또한 checklogin 페이지에서 변경합니다.

신의 사랑은 일반 텍스트 암호를 저장하지 않으므로 안전한 암호 해시 체계를 구현하는 데 비용이 들지 않습니다. php의 crypt() 함수를 매우 쉽게 사용할 수 있으며, 오픈 소스 보안 메소드에서도 이것을 체크 할 수 있습니다. http://www.openwall.com/phpass/

+0

그는 일반 텍스트 암호를 저장하지 않는다. 그는 md5를 사용합니다. 더 이상 안전하지는 않지만 평문보다 좋다 ^^ – Fender

+0

코드 라인을 놓쳤다.하지만 무적의 md5는 거의 안전하지 않다. – Brian

+0

보안 제안에 감사드립니다. login_success에 사용자 이름을 다시 설정하여 사용자 이름이 올바르게 설정되었는지 확인합니다. 문제는 제가 구현하기 전에있었습니다.var_dump ($ _ SESSION); 프로세스를 통해 모든 페이지에서 login_success와 index.php 사이의 전환이 중단됩니다. 인덱스 용 PHP 코드가 필요합니까? – Christopher

1

음,

귀하의 의견 감각은 아마 바로, 당신은 그것을 실현하지 않고 뿌리 설정하고있다. 방금 2 시간 동안 문제를 해결 한 후 그 일이 내가 깨닫고있었습니다.

아무리 노력해도 $ _SESSION [ 'username']이 (가) 실제 사용자 이름에서 'root'로 변경되었습니다.

마침내 $ _SESSION [ 'username']이 (가) 실제로 어디에서나 변경되지는 않았지만 $ username이 (가) 깨달았습니다.

<?php 
    if(!empty($_SESSION['username'])){ 
      $username = $_SESSION['username']; 
      require_once '../includes/connect_to_db.php'; 
      echo $_SESSION['username']. ' is correct but '. $username. 'is not.'; 
    } 
?> 

마지막으로 우리가 필요한 파일 connect_to_db.php에서 볼 :

<?php 
    $host="localhost"; // Host name 
    $username="root"; // mysql username 
    $password=""; // mysql password 
    $db_name="BH_web_DB"; // Database name 

    // Connect to server and select database. 
    mysql_connect("$host", "$username", "$password")or die("cannot connect: ". mysql_error()); 
    mysql_select_db("$db_name")or die("cannot select DB"); 
?> 

간단한 수정 :

$db_username="root"; // mysql username 

그래서 내가 설정 사실이었다 그것은 너무 루트 =) 이유는 여기에있다 이것이 다른 사람을 돕기를 바랍니다.

관련 문제