使用bCrypt哈希密码登录PHP

时间:2017-07-09 07:16:53

标签: php mysql hash login bcrypt

为什么其他帖子没有帮助?

      其他帖子没有帮助,因为尽管有很多类似的问题,但是没有人提问,因为有很多类似的问题。

更多详情

    我想要做的是让用户使用他的密码登录。但是,密码在数据库中使用bCrypt进行哈希处理。

当我尝试输入真实密码时,它不起作用并且说密码不正确。

但是,当我尝试输入哈希密码时。它说:"成功登录"。

如何使用真实密码登录而不是哈希?!

代码

的login.php

<form method="post" action="loginsession.php">//login
    <p>Username <input type="text" name="uid" size="20"> </p>
    <p>Password <input type="password" name="pwd" size="20"> </p>
    <p><input type="submit" value="Login" name="login"></p>
</form>

Loginsession.php

  <?php 
   session_start(); 
   include ('dbhandler.php'); 
   $uid = $_POST['uid']; 
   $pwd = $_POST['pwd']; 

   $sql = "SELECT * FROM user WHERE uid='$uid' and pwd='$pwd' "; 
   $result = mysqli_query($conn, $sql); 
   $row = mysqli_fetch_assoc($result); 
   $encrypted_pwd = password_hash($pwd, PASSWORD_DEFAULT); 
   $hash = password_verify($pwd,$encrypted_pwd); 
   $count = mysqli_num_rows($result);


   if ($count == 1) {
   echo("Logging in...");
   $_SESSION['id'] = $row['id']; 
   $_SESSION['uid'] = $row['uid']; 
   $_SESSION['pwd'] = $row['pwd'];
   echo("<h1 style='color:green;'>Successfully Logged In");

   } 
    else {
           echo "Your Login Name or Password is invalid";
                die();
         }

    ?>

2 个答案:

答案 0 :(得分:2)

错误很多,重写更合适:

<?php 
   session_start(); 
   include 'dbhandler.php'; // shouldn't be include './dbhandler.php'; ? 
   $uid = $_POST['uid']; 
   $pwd = $_POST['pwd']; 

   $sql = "SELECT * FROM user WHERE uid='".mysqli_real_escape_string($conn, $uid)."'"; 
   $result = mysqli_query($conn, $sql);
   if (mysqli_num_rows($result) === 1) {
     $row = mysqli_fetch_assoc($result);
     if (password_verify($pwd, $row['pwd'])) {
       $_SESSION['id'] = $row['id']; 
       $_SESSION['uid'] = $row['uid']; 
       $_SESSION['pwd'] = $row['pwd'];
       // redirect to "login success" page would be a better solution
       echo "<h1 style='color:green;'>Successfully Logged In";
     } else {
       echo "Invalid password";
     }
   } else {
     echo "Your login name is invalid";
   }

答案 1 :(得分:0)

  1. 您绝不应将文本用户输入用作查询的参数。这使您容易受到SQL injection的攻击。为了防止这种情况,请使用PDOmysqli_*(但在这种情况下使用适当的函数来转义参数),这些都有详细记录。

  2. 您可以按原样传递密码来定义和执行查询。您需要在将密码传递给查询之前对密码进行哈希处理,并将$encrypted_pwd传递给查询。

  3. 在这种情况下,我建议在查询结束时使用limit 0, 1,因为这将指定您只对第一个相应的行感兴趣,如果存在,那么查询将是如果找到用户则停止并且不继续搜索用户。这将优化您的查询。

  4. 由于您不想加载与用户相关的任何特定数据,因此您只想确定用户是否存在,您可以通过将select *替换为{{1}来进一步优化您的查询这将显着减少你的RDBMS必须发送的数据大小,因为只返回一个数字,而不是整个记录,可能还有用户的传记。

  5. 永远不要在会话中存储用户密码。如果出于某种原因select 1将被输出到浏览器,那将是一个严重的漏洞。