PHP password_verify不适用于数据库

时间:2017-05-07 03:10:03

标签: php mysql password-protection php-password-hash

我试图让我的页面更安全,我开始使用密码加密部分。我试图实施password_hash +密码验证,但到目前为止,我还没有成功完成整个工作。所以,这是在我的登录区域:

$username = mysqli_real_escape_string($connection, $_POST['username']);

$password = mysqli_real_escape_string($connection, $_POST['password']);

$query = "SELECT username, password FROM `users` WHERE username='$username' and user_enabled='1'";
$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
if($row = mysqli_fetch_assoc($result)) { $dbpassword = $row['password']; }

if(password_verify($password, $dbpassword)) {
    echo "Successful login";
}else{
    echo "Invalid Login Credentials.";
}

我总是获得无效的登录凭据。

当我修改用户的新密码时,我正在执行以下操作:

$pass = mysqli_real_escape_string($connection, $_POST['password']);
$options = [ 'cost' => 10,
             'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
           ];
$password = password_hash($pass,  PASSWORD_BCRYPT, $options)."\n";

$query = "UPDATE users 
          SET `password` = '".$password."'
          WHERE id = ".$_POST['user_id']."
          ";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
数据库中的

密码是VARCHAR(255),它存储的内容如下:

$2y$10$Y5HIyAsLMfkXIFSJONPsfO3Gxx3b46H.8/WFdLVH3Fqk2XNfy2Uaq

我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

以下行中的GanttRenderer是嵌入换行符(编辑:一个不能包含在用户输入的密码中)

\n

你需要删除它并重新开始使用新的哈希。

Jay Blanchard,Stack submitted a note上的成员,在password_hash()手册中也不会太长,这是他和我实际谈到的内容。

  

使用将换行符$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n"; 连接到散列末尾的文档中的示例时要小心,即:

     

\n

     

人们使用连接的换行符存储哈希值,因此echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";将失败。

另一种选择是使用trim();这也有效(在哈希的时刻)。

password_verify()

然而,你仍然需要通过清除旧的哈希值并创建新的哈希值来重新开始。

但请记住,您不应该逃避密码。

$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n"; $password = trim($password); // Store in db after (完全有效)之类的内容将被real_escape_string()修改为123'\abc;它不需要。 <{3}}在安全方面处理这个问题。