尝试验证散列密码并验证登录pdo php

时间:2017-09-15 12:45:24

标签: php mysql pdo hash

您好我正在尝试使用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>';
  }}}}
  ?>

2 个答案:

答案 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)) {

}
?>

您不需要在查询中对它进行比较,只需通过提供的用户名检索密码(如果用户名有效),然后验证。