Php 密码验证返回true

Php 密码验证返回true,php,mysql,mysqli,hash,Php,Mysql,Mysqli,Hash,我想将我的密码和哈希密码与password\u verify进行比较,但总是返回true。为什么会发生这种情况 代码如下: if($_SERVER["REQUEST_METHOD"] == "POST") { // username and password sent from form $myusername = mysqli_real_escape_string($db,$_POST['username']); $mypassword = mysqli_real_

我想将我的密码和哈希密码与password\u 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';,然后检查$a==“foo”-检查将始终返回true

相反,根据用户名从数据库中获取散列值,并将其用作password\u hash的第二个参数

而且

不要与数据库中的哈希进行比较,获取它,然后通过密码验证运行它 使用准备好的语句而不是标准的查询方法,并使用real_escape_string-请参阅
您对SQL注入持开放态度,应该立即解决它为什么不返回true?另外:必须使用预先准备好的语句警告。您如何知道/期望它为假?您应该从数据库中选择密码,并将其与输入的密码进行比较-您正在有效地将其与自身进行比较。您不应该在用户名或密码上使用mysqli\u real\u escape\u字符串,因为这会改变它们的值,使您的用户无法实际将inNote登录到OP:Using?占位符和bind_param被称为使用准备好的语句,这有效地消除了SQL注入的风险,也意味着在查询中使用它们之前不必清理输入。不要与数据库中的哈希进行比较,获取它,然后通过password\u hash运行它确实在WHERE中添加passhash可能会再次导致错误,因为数据库的设计目的是尽可能快地返回数据。。。尤其是当passhash包含在索引中且Btree搜索算法在时间上非常稳定时。@RaymondNijland不仅如此,每个hash的hash都是不同的-因此,即使密码实际上是正确的,您也无法获得匹配项。但是,是的,也是这样!事实上,我知道@Qirel password_散列可以防止彩虹表,使用河豚也可以防止GPU集群的暴力攻击。。因为河豚的设计是为了在CPU上运行不快,在GPU上运行极慢,如果你能让它工作的话。
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();
}