Php 无法验证密码

Php 无法验证密码,php,hash,Php,Hash,我可以看到这个问题已经被问了很多次,并且已经给出了答案,但是我们将非常感谢您的新帮助。 在使用password\u hash()将密码提交到数据库之前,我一直在尝试对密码进行哈希处理。它可以工作,但密码\u verify()不起作用。我试着用比我想象的更多的方式编辑,但仍然不起作用。同时,我以前一直在使用sha512方法,但我注意到生成的字符串对于这个特定页面的所有密码都是相同的——数据库中的其他页面及其各自的表不受影响。 下面是密码\u散列文件: function test_input($da

我可以看到这个问题已经被问了很多次,并且已经给出了答案,但是我们将非常感谢您的新帮助。 在使用password\u hash()将密码提交到数据库之前,我一直在尝试对密码进行哈希处理。它可以工作,但密码\u verify()不起作用。我试着用比我想象的更多的方式编辑,但仍然不起作用。同时,我以前一直在使用sha512方法,但我注意到生成的字符串对于这个特定页面的所有密码都是相同的——数据库中的其他页面及其各自的表不受影响。 下面是密码\u散列文件:

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
  return $data;
}
include('config.php');
$conn = mysqli_connect(DB_DSN,DB_USERNAME,DB_PASSWORD,'kqusers');
$name = test_input($_POST['name']);
$pName = test_input($_POST['pName']);
$month = $_POST['month'];
$day = $_POST['day'];
$year = $_POST['year'];
$date = $month." ".$day." ".$year;
$class = $_POST['level'];
$username = test_input($_POST['username']);
$password = test_input($_POST['pass']);
$enc_password = password_hash($password, PASSWORD_DEFAULT);
$insert = mysqli_query($conn,"INSERT INTO student_user (name, parent_name, dob, class, username, password) VALUES ('$name', '$pName', '$date', '$class', '$username', '$enc_password')");
if ($insert) {
    echo "inserted";
}
else{
    echo "error";
}
mysqli_close($conn);
现在,密码\u验证文件:

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
 }
include('config.php');
$conn = mysqli_connect(DB_DSN,DB_USERNAME,DB_PASSWORD,'kqusers');
$username = test_input($_POST['username']);
$password = test_input($_POST['password']);
$user_qry = mysqli_query($conn,"SELECT username FROM student_user WHERE username= '".$username."'");
$user=mysqli_fetch_assoc($user_qry);
$num_users = mysqli_num_rows($user_qry);
if ($num_users == 0) {
    echo "user_error";
}
else{   
    $pass_qry = mysqli_query($conn,"SELECT password FROM student_user WHERE username= '".$username."'");
    $pass = mysqli_fetch_assoc($pass_qry);
    $enc_password = $pass["password"];
    $verify = password_verify($password, $enc_password);
    if ($verify) {
        echo "login";
    }
    else{
        echo "error";
    }
}
mysqli_close($conn);
密码字段是varchar(255),我想我已经采取了所有我知道的预防措施。我试着运行几行代码,看看哪里可能出错。在这个文件中,我用一个字符串“jim”初始化一个变量,对它进行散列,然后验证它。但当我在散列后将相同的“jim”作为密码插入数据库并尝试验证它时,它返回false。这就是我的意思:

$pass = "jim";
$enc_pass = password_hash($pass,PASSWORD_DEFAULT);
$ver = password_verify($pass,$enc_pass);
if($ver){
    echo "yes";
}
else{
    echo "no";
}
上述代码显示“是”。但是,当我通过非响应页面将散列“jim”插入DB并尝试根据散列字符串验证它时,如下所示:

$pass = "jim";
$enc_pass = password_hash($pass,PASSWORD_DEFAULT);
$ver = password_verify($pass,'$2y$10$puPHBPrgSM2gPoECXH43vev6c9PCSDoOpdGwEryL/WsZTqR8ofZ8a');
if($ver){
    echo "yes";
}
else{
    echo "no";
}

它返回“否”。

散列时,实际上是在散列一个空字符串,而不是密码。对于您提供的哈希,以下返回
true

password_verify('','$2y$10$puPHBPrgSM2gPoECXH43vev6c9PCSDoOpdGwEryL/WsZTqR8ofZ8a');
这意味着密码散列文件中的
$password
变量实际上是空的。这也解释了为什么
sha512
散列的输出对于每个密码都是相同的,这显然是不应该发生的。找到具有相同
sha512
哈希的两个不同字符串的机会基本上为零

我的猜测是您混淆了
$\u POST['pass']
$\u POST['password']
,因为您在验证脚本中使用后者,但这只是一个猜测


另一方面,您需要停止将变量直接放入SQL查询中,因为这会使脚本容易受到SQL注入攻击。相反,请使用带有绑定参数的准备语句。

您完全正确!在页面注册页面上,我有3个变量:pass1、pass2和pass。pass1和pass2变量用于验证注册中使用的密码,而pass变量初始化为空字符串。其思想是将pass1的值赋给pass。在这样做的过程中,我实际上编写了pass==pass1(这使得pass变量仍然是一个空字符串),而不是pass=pass1。我为自己感到羞耻,但谢谢你结束了我的噩梦