我在学校(初学者)建立一个登录/注册项目,我有点卡住了。我注册时设法让用户/盐。但是,当我想用哈希/盐验证他们的登录信息时,我似乎无法将其拉下来。
我的注册码是:
$localhost="host";
$user="user";
$password="password";
$database="database";
$email =$_POST['email'];
$passwords =$_POST['passwords'];
$conn =new mysqli($localhost, $user, $password, $database);
$error =$conn->connect_error;
if($error){
$code = $conn->connect_errno;
die("Error: ($code) $error");
}
$email = mysqli_real_escape_string($conn, $_POST['email']);
$passwordFromPost = $_POST['passwords'];
$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
$passwords = mysqli_real_escape_string($conn, $_POST['passwords']);
$sql = "INSERT INTO Users (email, passwords, salt)
VALUES('$email','$passwords','$salt')";
$result= $conn->query($sql);
$conn->close();
我在这里的另一篇文章中读了一些关于它的内容,我想我应该能够用$passwordCorrect = password_verify("password", $hashPassword);
但我不确定如何在PHP代码中实现它并使其验证用户。 关于下一步应该做什么的任何提示?
答案 0 :(得分:1)
您实际上并没有创建一个盐it is included as part of the hash,而是使用password_hash()
函数验证密码。您永远不会使用此功能解密密码,您只需验证散列是否正确。
这一行$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
实际上并没有创建一个盐 - 它会创建一个密码哈希。
你是否正确使用这样的函数:
$passwordCorrect = password_verify("password", $hashPassword);
如果验证密码,则$passwordCorrect
将为true
。如果没有,则为false
:
if($passwordCorrect) {
// allow login
} else {
// do not allow login
}
在您的代码中,您可以删除一些行并更改为:
$email = mysqli_real_escape_string($conn, $_POST['email']);
$passwordFromPost = $_POST['passwords'];
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);
现在你所要做的就是存储密码和电子邮件而没有其他数据。
现在,查询数据库:
$stmt = $conn->prepare('SELECT * FROM Users WHERE email = ?');
$stmt->bind_param("s", $_POST['email']);
$result = $stmt->execute();
现在,用户的密码位于结果数组中,可以与$_POST['password']
进行比较。
如果您使用的PHP版本低于5.5,则可以使用password_hash()
compatibility pack。 没有必要escape passwords 或在散列之前对它们使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。
此外: Little Bobby说 your script is at risk for SQL Injection Attacks. 了解prepared MySQLi语句}}。即使escaping the string也不安全!
答案 1 :(得分:0)
首先在查询中使用预准备语句,而不是真正的转义字符串,以便从一开始就习惯于最佳实践。
您不应该存储密码,只能存储密码。所以改变
$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
到
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);
并且只存储电子邮件和哈希密码。然后在检查登录时,选择密码,其中email =提供的电子邮件,并使用password_verify('登录时的密码','从db中选择的密码'),如果密码匹配,结果将为真。