我在使用password_hash和password_verify函数验证密码时遇到了麻烦。 由于某种原因,它总是返回false。
当用户提供电子邮件和密码时,哈希存储在数据库中,如果存在提供的电子邮件的用户的记录,则验证提供的传递和来自该用户记录的哈希(返回false,提供正确的密码)。
以下代码用于测试目的,因为它在真实环境中无法正常工作(数据存储在数据库中)
下面是一些代码。
<?php
//create random password with 15 chars
$pass = generate_random_string(15);
$hash = password_hash($pass, PASSWORD_BCRYPT);
var_dump(password_verify($pass, $hash));
//returns bool(true)
直到这一部分一切正常,它会创建一个传递,哈希并在验证时返回true。 现在是奇怪的部分。
if (isset($_GET['pass']) &&
isset($_GET['hash'])) {
var_dump(password_verify($_GET['pass'], $_GET['hash']));
//returns bool(false)
}
?>
如果我采用先前生成的值(pass和hash)并传递它们有url参数并验证它们,则返回false。
我在这里做错了什么?
更新
dumping $ _GET数组显示正确的参数和值。
答案 0 :(得分:2)
尝试在将值附加到网址之前对值进行编码:
$pass = generate_random_string(15);
$hash = password_hash($pass, PASSWORD_BCRYPT);
var_dump(password_verify($pass, $hash));
$pass_encoded = urlencode($pass); // PASS THIS IN THE URL
$hash_encoded = urlencode($hash); // PASS THIS IN THE URL
解码它:
if (isset($_GET['pass']) && isset($_GET['hash'])) {
var_dump(password_verify(urldecode($_GET['pass']), urldecode($_GET['hash'])));
}