2012-05-15 3 views
1

여기 내 멍청이 머리를 찢어 버리고 있습니다. 왜 아래 코드가 작동하지 않는지 이해할 수 없습니다. 페이지가 올바르게로드되지만 데이터베이스에있는 사용자 이름과 암호로 로그인하려고하면 로그 아웃 단추를 실제로보고 싶을 때 페이지가 로그인 양식으로 원래 상태로 다시로드됩니다. 또한 소금과 해시가없는 암호를 데이터베이스에서 무분별하고 무질서한 암호와 비교해 보았습니다. 작동 안함.비밀번호 확인 로그인하지 않습니다. 로그인 페이지를 다시 불러옵니다.

유일한 경고는 입니다. "시스템의 시간대 설정에 의존하는 것은 안전하지 않습니다.", 나는 암호 검증 기능과 관련이 없다고 생각합니다.

페이지는이처럼 시작합니다

session_start(); 

error_reporting(-1); ini_set('display_errors', 'On'); 

그런 다음 약간의 HTML을 따른다. 그런 다음 :

if (isset($_POST['log_out'])) { 
    session_unset(); 
    session_destroy(); 
    $_SESSION = array(); 
} 

로그 아웃 버튼을 누르면, $_POST['log_out']을 설정합니다.

function mysql_fix_string($string) { 
    if (get_magic_quotes_gpc()) $string = stripslashes($string); 
    $string = htmlspecialchars($string, ENT_QUOTES); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

그런 다음 사용자가 동일한 페이지로 다시 (이 게시물 로그인 양식을 제출 한 경우에만 실행해야 암호 검증 부분을, 제공 : 그런 다음 SQL 주입을 방지하기 위해 사용 나는이 책에서 가져온 기능이 온다 따라서) $_POST['username']$_POST['password'] 설정 :

if (isset($_POST['username']) && isset($_POST['password'])) { 

    $salt1 = 'how'; 
    $salt2 = 'pony'; 
    $password = md5($salt1 . $_POST['password'] . $salt2); 

    $db_hostname = 'xxxxxxxxx'; 
    $db_username = 'xxxxxxxxx'; 
    $db_password = 'xxxxxxxxx'; 
    $db_database = 'xxxxxxxxx'; 

    $db_server = mysql_connect($db_hostname, $db_username, $db_password); 

    if (!$db_server) die("Unable to connect to MySQL: " . mysql_error()); 

    mysql_select_db($db_database) 
     or die("Unable to select database: " . mysql_error()); 

    $username = mysql_fix_string($_POST['username']); 

    $query = "SELECT password FROM users WHERE name = '" . $username . "'"; 

    $result = mysql_fetch_assoc($query); 
    $passwordindatabase = $result['password']; 

    if ($password == $passwordindatabase) { 
     $_SESSION['logged_in'] = true; 
     $_SESSION['user'] = $username; 
     unset($_POST['username']); 
     unset($_POST['password']); 
    } 

} 

비트는 상기 다운 로그인 폼 만 if ($_SESSION['logged_in'] != true) 보여 온다. 입력란 usernamepassword의 값을 $_SERVER['REQUEST_URI'] (동일한 페이지)에 게시합니다.

+1

$ passwordindatabase 및 $ password의 var_dump()를 제공 할 수 있습니까? 실제로 일치하는지 확인하려면? – Bono

+0

의견을 보내 주셔서 감사합니다. 사실 $ password는 예상대로 string (32) "a18c15de5dbeb62f3bb78d4212bcc3b8"이지만 $ passwordindatabase는 NULL입니다. 분명 여기에 문제가 있습니다. – Johanna

+1

사용중인 사용자가 데이터베이스에 있는지 확인하십시오? 또한 $ username과 $ _POST [ 'username']가 일치합니까? 그 전체 mysql_fix_string()은 당신이 의도했던 것을 망칠 수도 있습니다. ** 편집 ** 또한 SQL 문에서 참조하는 테이블과 필드가 올바른지 확인하십시오. – Bono

답변

4

mysql_query() 함수가 누락되었으므로 실제로 쿼리를 실행하지 않는 것처럼 보입니다.-

는 mysql_query 작동하는지

는 다음을 수행 볼 MySQL의 쿼리를 보내기 :

$result = mysql_query($query); 

$passwordindatabase = mysql_fetch_assoc($result); 

편집
을 완전히 다른 메모에서, 당신은 MySQL을 사용하지 않아야 함수는 꽤 구식이며 mysql_injection 취약점이 있기 때문에 함수이다. 가능한 한 빨리 PDO로 작업을 시작하라는 조언을 드릴 것입니다. (올바르게 수행 된 경우) mysql_injection 가능성이 없습니다.

+1

PDO bump +1 : mysql *이 인터넷에서 죽는 데 시간이 좀 걸릴 것입니다. ( – Cylindric

+0

고마워요, 친절 하군요! :) – Johanna

+0

@Cylindric 의견으로는 무엇을 의미합니까? 멍청한 놈에게 설명해주세요. :) (적어도 제 코드에서는 중요합니다.) – Johanna

0

쿠키 기반 세션을 사용하려면 브라우저에 아무것도 출력하기 전에 session_start()을 호출해야합니다.

하지만 시간대 경고는 전에 전송됩니다.

php.ini 파일에 시간대를 설정하십시오.

편집. 이 문제뿐만 아니라. mysql_fetch_assoc() 전에 SQL 요청시 mysql_query() 함수를 사용해야합니다.

if (strcmp($password, $passwordindatabase) == 0) { 

는 또한 우리가 볼 필요가 :

if ($password == $passwordindatabase) { 

나는 이런 식으로 뭔가를보고 선호하는 것 :

+1

고마워,하지만 그게 문제라고 생각하지 않아. 암호 확인 기능을 추가하기 전에 session_start()가 맨 위에 있으며이 페이지에서 잘 작동합니다. (전에 정적 사용자 이름과 암호를 가졌습니다.) – Johanna

0

당신이 보여있는 코드에 대해 "냄새"있는 유일한 비트는 이것이다 명확하게 $password$passwordindatabase이 일치하지 않기 때문에 실제로 users 테이블에 값을 삽입하는 코드는 일치하지 않습니다.

+0

"못 생겼어": $ salt1 = 'how'; $ salt2 = '조랑말'; $ password = md5 ($ salt1. "qwerty". $ salt2); echo $ password; 그런 다음 내 쿼리 브라우저에서 SQL 인서트 쿼리에 에코 된 내용을 복사합니다. 테스트 할 무언가가 있어야합니다. 테이블 사용자에게는 ID (자동 증가 정수), 이름 및 암호의 세 가지 필드가 있습니다. – Johanna