PHP密码_verify()

时间:2016-09-30 09:15:27

标签: php hash

我没有轻易提出这个问题,因为我整个晚上都认真地使用了50多个链接,试图让password_verify()工作。

1-哈希是100%正确的。
2-纯文本Verison 100%正确。
3-哈希长度实际上是60.
4-尝试Password_Default和Password_Bcrypt
5-它成功地将密码从数据库中拉出。

BUT

if(password_verify($answer,$secAnswer)){ } IS ALWAYS false.

这是我的代码。

  function anti_injection_login($sql, $formUse = true){
$sql = preg_replace("/(from|select|insert|delete|where|drop table|show tables|,|'|#|\*|--|\\\\)/i","",$sql);
$sql = trim($sql);
$sql = strip_tags($sql);
if(!$formUse || !get_magic_quotes_gpc())
  $sql = addslashes($sql);
return $sql;
}


  $email = anti_injection_login($_POST['email']);
  $answer = anti_injection_login($_POST['answer']);
  $queryAccount = mysqli_query($conn, "SELECT * FROM Accounts where email= '$email'");
  $count = mysqli_num_rows($queryAccount);
  if($count == 1){
     $rows = mysqli_fetch_array($queryAccount);
     $secAnswer = $rows['secretkey'];

     if(password_verify($answer,$secAnswer)){
         echo "Successful";
     }else{
         echo "Try Again";
     }
  }

anti_injection_login只是为了阻止人们注入它。 这不是问题。
无论我把Echo放在哪里 $ secAnswer和$ answer它总是正确的,就像我预期的那样。

有什么我想念的人吗? 我现在对此感到非常难过。

(是的,这是整个脚本)。所以我不会遗漏任何东西。 但正如前面提到的那样,根据数据库版本的相同,它成功地提取了哈希值(并且是正确的)。

我用于散列的单词是相同的(尝试大写和小写)。

1 个答案:

答案 0 :(得分:1)

PHP Manual给出了一个非常明确的例子:

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

首先,当用户注册时,您的密码哈希需要由password_hash()函数创建。

登录时,您将表单中的密码与数据库中存储的哈希值一起传递给password_verify()

但是,您的代码通过anti_injection_login()传递表单数据,这对任何给定的输入做了谁知道什么。如果您将密码直接传递到password_verify(),则无需清理密码。我强烈建议您使用预准备语句从数据库中检索哈希值,并将$_POST['answer']直接传递给password_verify()