gpt4 book ai didi

PHP password_verify 不适用于数据库

转载 作者:行者123 更新时间:2023-12-01 00:18:23 31 4
gpt4 key购买 nike

我正在尝试创建一个更安全的页面,我从密码加密部分开始。我正在尝试实现 password_hash + password verify,但到目前为止,我一直未能使整个工作正常进行。所以,它在我的登录区域:

$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

我在这里做错了什么?

最佳答案

下一行中的 \n 嵌入了换行符,(编辑:不能包含在用户输入的密码中的换行符)

$password = password_hash($pass,  PASSWORD_BCRYPT, $options)."\n";

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

Jay Blanchard , Stack 上的成员 submitted a note关于它不太长也在password_hash()手册,这是他和我实际谈论过的东西。

Be care when using the example from the documentation which concatenates a newline character \n to the end of the hash, i.e.:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

People are storing the hash with the concatenated newline and consequently password_verify() will fail.

另一种选择是使用 trim() ;这也有效(在散列时)。

$password = password_hash($pass,  PASSWORD_BCRYPT, $options)."\n";
$password = trim($password);
// Store in db after

但是您仍然需要通过清除旧哈希并创建新哈希来重新开始。

不过请记住,您不应该对密码进行转义。

123'\abc(完全有效)将被 real_escape_string() 修改为 123\'\abc ;不需要。 password_verify()从安全角度考虑,会处理好这一点。

关于PHP password_verify 不适用于数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43827437/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com