2012-12-21 15 views
-5

로그인 할 때마다 비밀번호가 정확하면 비밀번호가 잘못되었다고 표시됩니다. 어떻게하면이비밀번호가 맞지만 비밀번호가 정확하지 않습니다.

<?php 
session_start(); 
require "php/dbc.php"; 

$username  = mysql_real_escape_string($_POST['username']); 
$password  = mysql_real_escape_string($_POST['password']); 
$enc_password = md5($password); 

if ($username && $password) { 
    $query = mysql_query("SELECT * FROM login WHERE username='$username'"); 
    $numrow = mysql_num_rows($query); 
    if ($numrow != 0) { 
     while ($row = mysql_fetch_assoc($query)) { 
      $db_username = $row['username']; 
      $enc_password = $row['password']; 
     } 
     if ($username == $db_username && $enc_password == $db_password) { 
      //echo "Logged in <a href='members.php'>Click here to enter the members area</a>"; 
      $_SESSION['username'] = $db_username; 
      header("location: members.php"); 
     } else { 
      header("location: top_nav.html?error=Incorrect Password"); 
     } 
    } else { 
     header("location: top_nav.html?error=That user doesn't exist"); 
    } 
} else { 
    header("location: top_nav.html?error=All fields are required"); 
} 
?> 
+11

시작을 활용되어야한다 코드를 읽을 수있게 만들어야합니다. –

+0

코드가 화면에 표시되면 잔인 함없이 동의하십시오. 그러면 코드를 많이 정리해야합니다. 여기에 글을 올리려는 노력으로 엉망이 된 경우 게시물을 수정할 수 있습니다. –

+0

그냥 엉망으로 된 페이스트처럼 보입니다. 내가 할 수있는 최선의 포맷을 시도했다. –

답변

2

귀하의 오류에 해결하는 것입니다 당신이 얻을 테스트 데이터베이스에 저장된 암호 방법 :

while ($row = mysql_fetch_assoc($query)){ 
    $db_username = $row['username']; 
    $enc_password = $row['password']; // this should probably be $db_password 
} 
if ($username == $db_username && $enc_password == $db_password){ 
// this condition will be false as $db_password is null, 
// and so not equal to $enc_password which is currently set to the database value 

당신의 접근 방식이 비트 로터리은 - 일반적으로, 나는 사용자 이름을 쿼리 것 및 나중에 테스트하기 위해 데이터베이스에서 암호를로드하는 대신 암호화 된 들어오는 암호. -

또한 당신은 정말 MySQL의 라이브러리에 대한 PHP 매뉴얼 페이지에 큰 빨간색 상자에주의를 기울여야한다 :이 확장은 PHP 5.5.0 추천되지 않습니다

및 에서 제거 될 예정입니다 미래. 대신 MySQLi 또는 PDO_MySQL 확장을 사용해야합니다. 자세한 내용은 MySQL : API 가이드 및 관련 FAQ 선택을 참조하십시오. 정보. 이 기능에 대한 대안은 다음과 같습니다

mysqli_connect()

PDO :: __ 구조() 아래의 설명에서 언급 한 바와 같이

- 당신은 PDO와 준비 쿼리

+0

비록 문제에 동의하지만 사용자 이름과 암호를 모두 묻는 것에 동의하지 않습니다. 이건 내 의견이지만, 사용자 이름을 쿼리하고 php에서 비밀번호를 확인하는 것은 SQL 인젝션이 있으면 더 안전합니다. 사용자 이름과 암호를 모두 쿼리하면 결과 집합이 유효하다고 가정 할 가능성이 높습니다.이 경우 SQL 주입으로 인해 쿼리가 다른 행을 끌어 당기는 경우에는 사실이 아닐 수도 있습니다. PHP에서 암호를 확인함으로써 sql injection은 여러 행을 반환하지만 php는 암호를 확인하고 일치하지 않습니다. 이것은 단지 내 의견이며 아마 pdo/mysqli와는 논쟁의 여지가 있습니다. –

+0

mysql 인젝션이 문제가된다면, 당신의 전략은 실제로 그렇게 많이 완화하지 못할 것입니다 ... 당신은 PDO와 준비된 문장을 사용하는 것이 훨씬 낫습니다. – HorusKol

관련 문제