我没有轻易提出这个问题,因为我整个晚上都认真地使用了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它总是正确的,就像我预期的那样。
有什么我想念的人吗? 我现在对此感到非常难过。
(是的,这是整个脚本)。所以我不会遗漏任何东西。 但正如前面提到的那样,根据数据库版本的相同,它成功地提取了哈希值(并且是正确的)。
我用于散列的单词是相同的(尝试大写和小写)。
答案 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()
。