密码哈希不工作在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>
@Fred李:谢谢你,为我工作。我在数据库中的密码列长度是50.更新它,现在工作,谢谢你再次! - Bishwaroop Chakraborty的”
如commments讨论:
实施例从http://php.net/manual/en/function.password-hash.php
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
是60个字符
您的密码列的长度小于60,这就是问题
。太短,您的密码无声无息因为它,你需要在改变列的长度后重新使用新的哈希值。
- 该手册说255是一个不错的选择。
注:
注重留在关于XSS注入其他意见。
这里有一些好文章:
- How to prevent XSS with HTML/PHP?
- https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
和头后添加exit;
。否则,你的代码可能要继续执行。
imo,只需使用255的'varchar'字段。成本是额外的一个字节,并且这个错误永远不会发生。 imo,从不在数据库中使用确切长度的字符/ varchar字段。 –
@RyanVincent正好;我写了一篇关于手册的简短说明,说这是“一个很好的选择”;-)感谢您的评论顺便说一句。 –
对不起,@fred,我的意思是它的OP; - /手指问题 –
完成任何基本的调试,如检查您的查询是否成功并返回存储的散列?并且请注意,在表单的'action'中使用'$ _SERVER ['PHP_SELF']'就容易受到XSS攻击。 –
您需要在任何'header('location:...');'-call'之后添加'exit;',因为我们此时想停止向浏览器输出内容。 –
是的,对不起,已更新 –