您好我正在尝试使用pdo从数据库返回哈希密码,并允许用户在密码受到保护时登录。我已经建立了一个哈希密码的注册页面。我现在正试图将此事贬低。我觉得我很接近,但这已经被困在同一个地方很多天了,我希望有人可以帮我完成我的代码?
PHP致命错误:未捕获错误:在/var/www/html/login.php:54 \ nStack跟踪中调用boolean上的成员函数fetch():/ n#0 {main} \ n在/ var中抛出第54行的/www/html/login.php,引用者:http://172.16.62.211/login.php
if (isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$q = $handler->prepare('SELECT * FROM users WHERE username = ?');
$query = $q->execute(array(
$username));
$_SESSION['username'] = $username;
$count = $q->rowCount();
if ($count == 1 -> fetch(PDO::FETCH_ASSOC)){
$hash_pwd = $count['password'];
$hash = password_verify($password, $hash_pwd);
if ($hash_pwd == 0) {
header("location: login.php?error=empty");
}
else {
$q = $handler->prepare('SELECT * FROM users WHERE username = ? && password = $hash_pwd');
$query = $q->execute(array(
$username,
$password));
$count = $q->rowCount();
if($count == 1){
$_SESSION['username'] = $username;
header("location: index.php");
return;
} else {
echo '<p class="error-message3">'.'<br>'.'<br>'."You have ented an incorrecct login!<br>Please try again.".'</p>';
}}}}
?>
答案 0 :(得分:0)
你好了,你不能从你的数据库中取消密码。
正常例程基本上由of converting the password inserted by the user to your security logic encrypt and compare with the password stored in your db (hashed too)组成,这两个值必须等于验证。
如果哈希是正确完成的,那么在某些方面是不可能的,而不是指出你的想法的安全漏洞。
if ($count == 1 -> fetch(PDO::FETCH_ASSOC)){
$hash_pwd = $count['password'];
$hash = password_verify($password, $hash_pwd);
if ($hash === false) {
header("location: login.php?error=empty");
} else {
$_SESSION['username'] = $username;
header("location: index.php");
return;
}
} else {
echo '<p class="error-message3">'.'<br>'.'<br>'."You have ented an incorrecct login!<br>Please try again.".'</p>';
}
PS:缩进你的代码,并注意你正在重复检查的一些例程,在你已经检查过的password_verify中如上所述。
答案 1 :(得分:0)
您需要了解password_verify
的使用情况,它需要原始(未散列)版本的密码和 哈希 version(来自您的数据库)并分别返回true / false。
<?php
if (password_verify($raw, $hash)) {
}
?>
您不需要在查询中对它进行比较,只需通过提供的用户名检索密码(如果用户名有效),然后验证。