2016-09-30 47 views
0

我没有轻易地问这个问题,因为我在整个晚上认真考虑了超过50个链接,试图让password_verify()工作。PHP password_verify()

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

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,它总是正确的,正如我所期望的那样。

有什么我失踪的家伙? 现在我对此非常难过。

(是的,这是整个脚本)。所以我没有留下任何东西。 但如前所述,根据数据库版本相同,它成功地将哈希(并且是正确的)拉出来。

而我用于散列的词是Identical(同时尝试大写和小写)。

+3

请使用准备好的语句。你不需要推出自己的卫生设施。 –

+1

'$ rows ['secretkey']'包含了什么(提供示例)。并显示如何生成'secretkey'哈希。如果密码是'aliform_at_insert'类似的,''anti_injection_login''会破坏我的登录。 – Justinas

+2

对不起''anti_injection_login()'是要求你的网站被黑客入侵。准备好的陈述是你*需要的*。 – alex

回答

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()传递表单数据,该表单通过任何给定输入来执行who-know-what。如果您直接将其传递到password_verify(),则不需要清理密码。我强烈建议您使用准备好的语句从数据库检索散列,并将$_POST['answer']直接传入password_verify()