我制作了一个系统,用于在用户注册,邮件发送到他们的电子邮件时验证用户,并且当点击邮件中的链接时,帐户被激活。我的问题在于,当尝试使用电子邮件和输入密码登录时,它会抛出错误但是当我将10个字符随机字符串哈希密码复制到密码输入中时,它会获得访问权限...我的问题是“我该怎么办?使输入密码与散列密码匹配?“......我试图在这里发布脚本,但我不知道这是怎么做的
提前致谢!
答案 0 :(得分:2)
您可以选择加密方法,例如MD5,sha1等,以便在DB中保存用户密码并在登录前加密输入密码。
如果您使用MySQL保存用户数据。然后使用这样的查询,
SELECT * FROM users
WHERE email = '$email' AND password= MD5('$password')
答案 1 :(得分:2)
@vTp指的是执行MySQL查询的旧的不安全方法,但它打开了一大堆SQL注入,所以请使用prepared statements代替使用自动转义的类型转换的MySQL。
我的建议:
# Database credentials
$mysqlsrv = "localhost";
$mysqlusr = "myusr";
$mysqlpsw = "mypsw";
$mysqldb = "mydb";
# Connect to database in the secure "prepared statement" way
$mysqli = new mysqli($mysqlsrv,$mysqlusr,$mysqlpsw,$mysqldb);
# Check for database connection errors
if(mysqli_connect_errno()) {
echo "Cannot connect to database";
exit();
}
# The user credentials (this could be from $_REQUEST or alike)
$username = "myuser";
$password = "123456";
# Encrypt the password
$password = sha1($password); # or whatever you are using - maybe md5
$query = "SELECT userId FROM users WHERE usr=? AND psw=?";
if($stmt = $mysqli->prepare($query)) {
$stmt->bind_param("ss",$username,$password); # gets two strings as input. Use "i" for integer input instead of "s"
$stmt->execute();
$stmt->bind_result($userId);
# Check if the resultset from database is not empty
if($stmt->fetch()) {
echo "Found userID $userId";
} else {
echo "Could not find any users matching credentials";
}
$stmt->close();
}
您也可以使用MySQL编码明文密码 - 例如:
$query = "SELECT userId FROM users WHERE usr=? AND psw=SHA1(?)";
另一种方法(如果使用@vTp方法)可以从数据库中获取所有用户名和加密密码(不选择WHERE
子句),然后检查任何返回的行中是否存在匹配。通过这种方式,您也可以避免SQL注入,但这不是最好的方法(并且只能解决此特定查询的问题)。
答案 2 :(得分:1)
您应该使用可重现的哈希函数,例如sha或md5(安全性较低)。
要使用散列密码检查用户输入的密码,只需执行
function isValid($password) {
return sha1($password) == $this->hashedPassword;
}
底线:不要生成随机字符串作为密码,除非您可以重现它。