所以,我已经在adduser.php上创建了新帐户的密码:
if (isset($_POST['submit'])) {
require "../functions/db-insert.php";
$productcategory = [
'username' => $_POST['username'],
'password' => sha1($_POST['password']),
'isadmin' => $_POST['isadmin']
];
//$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
$category = insert($pdo, 'users', $productcategory);
echo "<p>User added</p>";
}
现在我正在尝试修改我的login.php,以便能够使用password_verify正确签名,但我似乎做错了,因为我无法再登录。
if (isset($_POST['submit'])) {
if (isset($_POST["username"]) && isset($_POST["password"])) {
$results = $pdo->prepare("SELECT * FROM users
WHERE username = :username AND password = :password");
$values = [
':username' => $_POST["username"],
':password' => $_POST['password']
];
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
$results->execute($values);
$row = $results->fetchAll();
if(count($row) < 1){
echo '<h3><strong>Wrong username or password!</h3>';
}
else if (!password_verify($password, $hash)){
$_SESSION['loggedin'] = true;
$_SESSION['name'] = $_POST['username'];
echo "<h3>Welcome back " . $_SESSION['name'] . " !</h3>";
}
}
}
在这一点上,我不完全确定我做错了什么,如果有人可以帮我解决我做错的事情,我会非常感激。我看了很多stackoverflow,但不幸的是,之前提出的问题都没有为我工作。
您正在重新扫描密码。当你使用password_hash
时,你没有得到相同字符串的相同值,所以你永远不会找到匹配。您需要选择密码(散列),然后将原始字符串(输入)传递给password_verify
。所以只需在where中使用用户名,然后使用结果密码和password_verify
中的原始字符串
尝试回显相同值的password_hash
(例如password_hash('test'....)
。你会看到。你还需要考虑使用md5,这是你以前做过的。如果这是一个实时系统,那将很难,因为你基本上需要让每个人都更改他们的密码或写下一些例程,以便他们下次登录时更新它(例如使用旧的验证方法然后使用password_hash()密码并更新它。)如果这不是生产代码,只需清除你的密码和重新开始。
另外我只是注意到你说如果密码验证返回false,(!password_verify...
你想要记录人员。所以你的逻辑回到了前面