PHP中的password_verify无法使用数据库

时间:2015-12-03 11:49:15

标签: php mysql mysqli

我正在尝试使用password_hash和password_verify函数使登录表单工作,但由于某些语法错误,我无法验证密码。

以下是我的注册脚本

<?php
    include("includes/connection.php");
        if(isset($_POST['reg'])) {

        //registration form
        $u_email = mysqli_real_escape_string($con, $_POST['email']);
        $u_pass = mysqli_real_escape_string($con, $_POST['password']);


        $get_email = "SELECT * FROM user WHERE user_email='$u_email'";
        $run_email = mysqli_query($con, $get_email);
        $check = mysqli_num_rows($run_email);  



        if($check==0){   


        $hashed_pass = password_hash('u_pass', PASSWORD_BCRYPT, array('cost' => 10));  

        $insert = "insert into user (user_email, user_pass) values ('$u_email', '$hashed_pass')";

        $run_insert = mysqli_query($con, $insert);

        if($run_insert) {
            echo "<script>alert('Registration Successful!')</script>";
        }
        else {
            echo "<script>alert('Registration not Successful!')</script>";

        }
        }
        else{

        echo "Email already registered";
        }

        }


?>

以下是登录脚本

<?php

    include("includes/connection.php");

        if(isset($_POST['login'])) {

            $u_email = mysqli_real_escape_string($con,$_POST['u_email']);
            $u_pass = mysqli_real_escape_string($con,$_POST['u_pass']);

            $get_user = "select user_pass from user where user_email='$u_email'";
            if(password_verify($u_pass, $user_pass)){

                $_SESSION['user_email']=$u_email;
                echo "<script>alert('Login successfull')</script>";
            }
            else {
                echo "<script>alert('Password or email is not correct!')</script>";
            }

        }
?>

即使登录详细信息正确,也只是显示('密码或电子邮件不正确!')。

1 个答案:

答案 0 :(得分:0)

您没有将用户密码传递给password_hash()函数。第一个参数应该是密码,即$ _POST [&#39;密码&#39;]不是&#39; u_pass&#39;。

$hashed_pass = password_hash($_POST['password'], PASSWORD_BCRYPT, array('cost' => 10));

还要小心SQL转义。您应该只转义进入SQL字符串的字符串。在你的代码中,你不能在password_hash()中使用$ u_pass,因为你已经使用了mysqli_real_escape_string,因此它不再是用户输入的字符串。

您的登录脚本也有一些错误。

if(password_verify($u_pass, $user_pass)){

$ u_pass已通过mysqli_real_escape_string,因此不是用户输入的内容。另外$ user_pass也不会被定义,因为你没有运行SQL并将user_pass分配给$ user_pass。

我建议退一步,在开发代码时留下密码。使用存储在数据库中的普通密码。然后,您可以通过查看数据库来验证它是否正确保存了电子邮件/密码。一旦它工作,然后添加密码哈希码。