我目前正在尝试更新我不安全的登录系统。但是不能弄清楚如何合并一个if (password_verify..)命令。
任何帮助都将是非常感激的。
//Create query
$qry="SELECT * FROM user WHERE username='$username' AND password='$password'";
$result=mysql_query($qry);
if($result) {
if(mysql_num_rows($result) > 0) {
//IF Login Successful
session_regenerate_id();
$user = mysql_fetch_assoc($result);
$_SESSION['SESS_USER_ID'] = $user['user_id'];
$_SESSION['SESS_FIRST_NAME'] = $user['username'];
$_SESSION['SESS_LAST_NAME'] = $user['password'];
session_write_close();
header("location: home.php");
exit();
}else {
//IF Login failed
$errmsg_arr[] = 'user name and password not found';
$errflag = true;
if($errflag) {
$_SESSION['ERRMSG_ARR'] = $errmsg_arr;
session_write_close();
header("location: index.php");
exit();
}
}
以下是你的问题的答案和一些一般情况:
密码验证功能:
一个好的做法是在存储敏感数据之前对它们进行加密。由于您不希望恶意的人能够检索密码,您将使用非对称(单向)加密算法家族,我们称之为哈希。您将通过使用输入值重新生成哈希来检查用户是否给了您正确的凭据,并将其与存储在数据库中的哈希进行比较。
在这个场景中,您没有在查询中插入任何用户输入。
您可以通过添加盐来增加哈希生成的复杂性。
password_hash文档非常明确,您可以在此链接中找到关于哈希算法的SO讨论。
帐户创建/密码更改步骤:
- 计算用户的密码哈希
- 存储在数据库
验证步骤如下:
- 检索到用户输入
- 调用password_verify($user_password_input, $hash_retrieved_from_db)函数
- 如果函数返回true,则用户通过认证
SQL注入和用户输入:
为什么不建议在查询中插入用户输入?
你不应该在查询中插入用户输入,因为SQL注入是用户让数据库执行他自己的查询的一种方式。使用注入,他可以显示或更新一些数据,而他不应该被允许这样做。
预防注射为了防止注入,思路是消毒/确保用户输入不包含恶意查询/指令。
现在,我们有像PDO这样的工具,通过使用准备好的语句来处理这些问题。