php - MySql Password_verify() 不工作?

标签 php mysql forms

在注册过程中,用户的密码作为加密的 BCRYPT 密码保存在数据库中。

我的问题是:为什么我不能用输入的密码验证加密后的数据库密码?

代码:

<?php                       //POST VARIABLES
                    $submit = $_POST['login_submit'];
                    $username = $_POST['login_username'];
                    $password = $_POST['login_password'];
                    $email = $_POST['login_email'];

require 'password_config.php';
if(isset($submit)){
require 'db/connect.php';
//PASSWORD VERIFYING
$pass_query = "SELECT password FROM users WHERE email='$email'";
$queried = mysql_query($pass_query);
while($row = mysql_fetch_array($queried)){
$user_pass = $row['password'];
$veri_password = password_verify($password, $user_pass);
}

//CHECKING NUM ROWS
$sql = "SELECT id, username FROM users WHERE password='$veri_password' AND email='$email'";
$entered_user = mysql_query($sql);
$num_rows = mysql_num_rows($entered_user);


//ERRS ARRAY DECLARED
$errors = array();

//FURTHER VERIFYING
if( $num_rows != 1 )
{
$errors[] = '-Account does not exist ';
}
elseif( $num_rows == 1 )
{
session_start();
while($row = mysql_fetch_array($entered_user)){
$_SESSION['key'] === true;
$_SESSION['id'] = $row['id'];
$_SESSION['email'] = $email;
$_SESSION['user'] = $row['username'];
$_SESSION['pass'] = $password;
header('Location: profile.php');
exit();
}
}
}   
?>

即使我输入了有效信息,我仍收到一条错误消息,提示“帐户不存在”。

谢谢, -尤金

编辑更改为:

        <?php                       //POST VARIABLES
                            $submit = $_POST['login_submit'];
                            $username = $_POST['login_username'];
                            $password = $_POST['login_password'];
                            $email = $_POST['login_email'];

    require 'password_config.php';
    if(isset($submit)){
    require 'db/connect.php';
    //PASSWORD VERIFYING
    $pass_query = "SELECT password FROM users WHERE email='$email'";
    $queried = mysql_query($pass_query);
    while($row = mysql_fetch_array($queried)){
    $user_pass = $row['password'];
    $veri_password = password_verify($password, $user_pass);
    }
    if($veri_password === true){
    //CHECKING NUM ROWS
       $sql = "SELECT id, username FROM users WHERE password='$user_pass' AND email='$email'";
       $entered_user = mysql_query($sql);
       $num_rows = mysql_num_rows($entered_user);


    //ERRS ARRAY ESTABLISHED
       $errors = array();

    //FURTHER VERIFYING
       if( $num_rows != 1 )
       {
       $errors[] = '-Account does not exist ';
       }
       elseif( $num_rows == 1 )
       {
       session_start();
       while($row = mysql_fetch_array($entered_user)){
       $_SESSION['key'] === true;
       $_SESSION['id'] = $row['id'];
       $_SESSION['email'] = $email;
       $_SESSION['user'] = $row['username'];
       $_SESSION['pass'] = $password;
       header('Location: profile.php');
       exit();
       }
       }
       }
    }   
    ?>

最佳答案

更改为:

$sql = "SELECT id, username FROM users WHERE email='$email'";

同时改变:

$veri_password = password_verify($password, $user_pass);

if(!password_verify($password, $user_pass)){
   echo 'invalid password';
   exit;
}

无论如何,您的代码容易受到 sql 注入(inject)攻击。请考虑在查询中使用准备好的语句或使用 mysql_real_escape_string 转义输入字符串。 .并且建议使用 mysqlipdo 而不是过程方法

关于php - MySql Password_verify() 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357392/

相关文章:

MySQL - 如何在嵌套的 IFNULL...GROUP_CONCAT() 条件下选择多个列?

forms - HTML Post 表单的身份验证 header

php - CakePHP - 如何添加/编辑 $this->passedArgs

mysql - Spring Hibernate事务隔离不能产生不可重复读

javascript - highchart 通过在下拉列表中选择月份来更改图表

php - 如何从数据库中获取重复的条目,而不是一次?

php - <td> 不填充所有动态表 HTML PHP MySQL

php - Symfony 嵌入式表单条件验证

php - 在 php 中传递 MySql 连接

php - 为 Woocommerce 中的登录用户隐藏 "Add to Cart"按钮