2016-10-14 1 views
0

나는 내 php PDO 코드에서 작동하도록 password_verify를 얻을 수 없다. 내 패스 필드는 varchar (255)로 저장됩니다. 나는 비슷한 질문을 읽었지 만, 나는 그것이 올바르게 설정되어 있다고 말할 수있다. 나는 아직도 뭔가를 놓치고 있어야합니다. 다음과 같이 내 등록 페이지가 .. 암호화 된 암호가 성공적으로 내 데이터베이스에 저장됩니다PDO에서 password_verify를 사용하는 올바른 방법은 무엇입니까?

$user = $_POST['username'] 
$pass = $_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
$query = $con->prepare("INSERT INTO emps (user, pass) VALUES (?, ?)"); 
$query->execute([$user, $passH]); 

입니다.

내 로그인 페이지는 다음과 같이 ...입니다 로그인 페이지의

if(isset($_POST['login'])) { 
    $username = $_POST['username']; 
    $pass = trim($_POST['pass']; 
    $passH = password_hash($pass, PASSWORD_DEFAULT); 
    $sel_user = $con->prepare("SELECT id, username, pass, gid FROM emps WHERE gid!=4 AND username=?"); 
    $sel_user->execute([$username]); 
    $check_user=$sel_user->fetch(); 
    if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 
    $_SESSION['username']=$check_user['username']; 
    header("Location: xadmin.php"); 
    exit; 
    } 
    else { 
    echo "<script>alert('Not Found')</script>"; 

바디 ..

<form action="login.php" method="post"> 
    <table width="100%" border="0"> 
     <tbody> 
      <tr> 
       <td bgcolor="#3B3B3B" height ="35" class="BodyTxtB" align="center">Administrator Login</td></tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Username</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="text" class="BodyTxtBC" name="username" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr> 
       <td class="BodyTxtB" align="center">Password</td> 
      </tr> 
      <tr> 
       <td class="BodyTxtB" align="center"><input type="password" class="BodyTxtBC" name="pass" required="required"/></td> 
      </tr> 
      <tr height="20"><td></td></tr> 
      <tr height="35"><td align="center"><input type="image" src="images/btn_login.jpg" name="login" value="Login"/> 
      <input type="hidden" name="login" value="Login" /></td></tr> 
      <tr height="20"><td></td></tr> 
     </tbody> 
    </table> 
    </form> 

사람이 오류를 발견 할 수 있습니까?

+1

https://phpdelusions.net/pdo/password_hash –

+2

확인하기 전에 암호를 해시하는 이유는 무엇입니까? –

+2

password_hash가 잘못 사용되었습니다. 데이터베이스에서 해시 된 비밀번호로 일반 텍스트 비밀번호를 제공해야합니다. 또한 왜 당신은 비밀 번호를 트리밍입니까? –

답변

1

password_verify()의 인수 (1) 원하는 해시되지 않은 암호를 확인하고, (2) 해시 암호를 기준으로 사용하고 있습니다. 당신은 비교하기 전에 첫 번째 인수를 해싱 있습니다 : 당신은 또한 password_verify($pass /** the unhashed one */, $check_user['pass'])

을 일을해야

$pass = trim($_POST['pass']; 
$passH = password_hash($pass, PASSWORD_DEFAULT); 
// ... 
if(count($check_user)>0 && password_verify($passH, $check_user['pass'])) { 

암호를 트리밍하는 것은 잘못된 생각이다. 비밀번호에 실제로 공백이 포함 된 경우 (으로 허용해야합니까?)

+0

고맙습니다. 시험해 보았지만 여전히 작동하지 않습니다. 이제 제출을 클릭하면 로그인 양식이 사라지지만 페이지로 리디렉션되지 않으며 경고 메시지가 표시되지 않습니다. – craisondigital

+0

@craisondigital 오류 로그와 브라우저 콘솔을 확인하십시오. 확률은 구문 오류 또는 로그인 페이지 논리로의 잘못된 리디렉션을 도입 한 것입니다. –

+0

@Ed Cottrell에게 감사드립니다. 현재 작동 중입니다. – craisondigital

2

RTM? http://php.net/password_verify

boolean password_verify (string $password , string $hash) 

당신은 $password에 대한 PLAINTEXT 암호를 전달합니다. 너 스스로 해시 하지마. 그러면 DIFFERENT salt로 새로운 해시를 생성하여 비교를 무의미하고 불가능하게 만듭니다.

password_verify$hash에서 적절한 소금을 추출하여 해시 문자열 $password에 사용하고 해시 문자열을 비교합니다.

password_verify은 기본적으로 그냥 이것이다 :

function password_verify($pw, $hash) { 
    $salt = get_salt_from($hash); 
    $temp = password_hash($pw, $salt); 

    return ($temp == $hash); 
} 
+0

PHP가 모든 것을 간단하게 처리하는 방법, 모든 것을 처리하는 두 가지 기능을 제공하는 것은 꽤 재미 있습니다.하지만 사람들은 여전히 ​​복잡한 것을 관리합니다. 추가 측정을 위해 $ temp === $ hash. –

+0

글쎄,'get_salt_from()'은 약간 까다로울 수 있지만, 그렇지 않으면 그렇습니다. password_verify는 기본적으로 단지 편의입니다. –

+0

감사합니다. @MarcB이 것을 설명해 주셔서 감사합니다. – craisondigital

관련 문제