password_verify返回true

时间:2019-07-10 13:39:49

标签: php mysql mysqli hash

我想将我的密码和哈希密码与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";
    }

1 个答案:

答案 0 :(得分:7)

您当前正在做的是对密码进行哈希处理(首先进行了转义;在更改哈希后,您永远都不应转义密码),然后将其与您刚刚哈希化的值进行匹配/验证,而无需使用数据库中的哈希值-因此它将始终匹配。等同于设置变量$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();
}