Cla*_*dio 0 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.";
}
Run Code Online (Sandbox Code Playgroud)
我总是获得无效的登录凭据.
当我修改用户的新密码时,我正在执行以下操作:
$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));
Run Code Online (Sandbox Code Playgroud)
数据库中的密码是VARCHAR(255),它存储的内容如下:
$2y$10$Y5HIyAsLMfkXIFSJONPsfO3Gxx3b46H.8/WFdLVH3Fqk2XNfy2Uaq
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
将\n
在下面的行中,嵌入换行符,(编辑:一个可以不被包括在用户输入的密码).
$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n";
Run Code Online (Sandbox Code Playgroud)
你需要删除它并重新开始使用新哈希.
在这里,Stack的成员杰伊布兰查德在手册中提交了一份关于它的说明不长 password_hash()
,这是他和我实际谈到的内容.
使用将换行字符连接
\n
到散列末尾的文档中的示例时要小心,即:
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
人们使用连接的换行符存储哈希值,因此
password_verify()
会失败.
另一种选择是使用trim()
; 这也有效(在哈希的时刻).
$password = password_hash($pass, PASSWORD_BCRYPT, $options)."\n";
$password = trim($password);
// Store in db after
Run Code Online (Sandbox Code Playgroud)
然而,你仍然需要通过清除旧的哈希值并创建新的哈希值来重新开始.
但请记住,你不应该逃避密码.
一种如123'\abc
(是完全有效的)将被修改为123\'\abc
通过real_escape_string()
; 它不需要.password_verify()
安全方面,照顾这一点.
归档时间: |
|
查看次数: |
839 次 |
最近记录: |