密码哈希不工作在PHP mysql

问题描述:

我想使用密码哈希使用phpmysql。问题是密码_验证似乎并没有为我工作到目前为止。假设我的密码在注册时是'123456789'。我将它存储在数据库中使用密码哈希不工作在PHP mysql

password_hash('123456789', PASSWORD_BCRYPT, array('cost' => 12)); 

然后,当我在登录字段中输入'123456789'时,它什么都不做,失败。

这里是我的代码:

<?php 
     session_start(); 
     include('db.php');   
?> 

<!DOCTYPE html> 

<head> 

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <meta name="viewport" content="width=device-width,initial-scale=1" /> 
    <link rel="stylesheet" type="text/css" href="style.css"/> 

</head> 

<body> 

<p/> 

<?php 

    if(isset($_POST['login']) && $_POST['login'] == 'Login') { 

     $loginEmail = $_POST['loginEmail']; 
     $loginPassword = $_POST['loginPassword']; 

     $sqlLogin = $db->prepare("SELECT * FROM registered_users WHERE email = ?"); 

     $sqlLogin->bind_param("s",$loginEmail); 
     $sqlLogin->execute(); 
     $sqlLogin = $sqlLogin->get_result(); 
     $numrowsLogin = $sqlLogin->num_rows; 

     if($numrowsLogin == 1) { 
      $rowLogin = $sqlLogin->fetch_assoc(); 
      $stored_password = $rowLogin['password']; 

     } 
     if(password_verify($loginPassword, $stored_password)){ 


      header('Location: homepage.php'); 
     }else{ 
      echo 'invalid login'; 
     }  

    }   
?> 


    <form action = "<?php echo $_SERVER['PHP_SELF'];?>" method="POST"> 
     <table style="width:500px">       
      <tr> 
       <td width="30%"><input style="width: 200px; height: 25px; border-radius: 5px;" type="text" name="loginEmail" placeholder = "Email" required/><br/></td> 
      </tr>      
      <tr> 
       <td width="30%"><input style="width: 200px; height: 25px; border-radius: 5px;" type="password" name="loginPassword" placeholder = "Password" required/><br/></td> 
      </tr> 
     </table> 

     <input style="font-weight: bold; width: 70px; height: 25px; border-radius: 5px;" type="submit" name="login" value="Login"/> 
    </form> 

</body> 

</html> 
+0

完成任何基本的调试,如检查您的查询是否成功并返回存储的散列?并且请注意,在表单的'action'中使用'$ _SERVER ['PHP_SELF']'就容易受到XSS攻击。 –

+0

您需要在任何'header('location:...');'-call'之后添加'exit;',因为我们此时想停止向浏览器输出内容。 –

+0

是的,对不起,已更新 –

@Fred李:谢谢你,为我工作。我在数据库中的密码列长度是50.更新它,现在工作,谢谢你再次! - Bishwaroop Chakraborty的”

如commments讨论:

实施例从http://php.net/manual/en/function.password-hash.php

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a是60个字符

您的密码列的长度小于60,这就是问题

太短,您的密码无声无息因为它,你需要在改变列的长度后重新使用新的哈希值。

  • 该手册说255是一个不错的选择。

注:

注重留在关于XSS注入其他意见。

这里有一些好文章:

和头后添加exit;。否则,你的代码可能要继续执行。

+1

imo,只需使用255的'varchar'字段。成本是额外的一个字节,并且这个错误永远不会发生。 imo,从不在数据库中使用确切长度的字符/ varchar字段。 –

+1

@RyanVincent正好;我写了一篇关于手册的简短说明,说这是“一个很好的选择”;-)感谢您的评论顺便说一句。 –

+0

对不起,@fred,我的意思是它的OP; - /手指问题 –