我想将我的密码和散列密码与password_verify()
进行比较,但总是返回true
。为什么会发生这种情况?
代码如下:
if($_SERVER["REQUEST_METHOD"] == "POST") {
// username and password sent from form
$myusername = mysqli_real_escape_string($db,$_POST['username']);
$mypassword = mysqli_real_escape_string($db,$_POST['password']);
$hash = password_hash($mypassword, PASSWORD_DEFAULT);
$ourdb = "SELECT handle FROM qa_users WHERE handle = '$myusername' and passhash = '$mypassword'";
$ourresult = mysqli_query($db,$ourdb);
$ourrow = mysqli_fetch_array($ourresult,MYSQLI_ASSOC);
$ouractive = $ourrow['active'];
$ourcount = mysqli_num_rows($ourresult);
if(password_verify($mypassword, $hash)){
echo "hashed";
}
最佳答案
您当前正在做的是散列密码(您首先转义了密码;您永远不应该转义密码,因为这会更改散列),然后将其与刚刚散列的值匹配/验证,而不使用数据库中的散列-因此它将始终匹配。这相当于设置一个变量$a = 'foo';
,然后检查if ($a == 'foo')
-检查将始终返回true。
相反,根据用户名从数据库中获取哈希值,并将其用作password_hash()
的第二个参数。
也,
不要与数据库中的哈希进行比较,获取它,然后通过password_verify()
运行它
使用准备好的语句(而不是标准的query()
方法和使用real_escape_string()
)-参见How can I prevent SQL injection in PHP?
if($_SERVER["REQUEST_METHOD"] == "POST") {
$stmt = $db->prepare("SELECT passhash FROM qa_users WHERE handle = ?");
$stmt->bind_param("s", $_POST['username']);
$stmt->execute();
$stmt->bind_result($hash);
$stmt->fetch();
if (password_verify($_POST['password'], $hash)) {
echo "Valid login";
} else {
echo "Invalid login";
}
$stmt->close();
}
关于php - password_verify返回true,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56972016/