我有一个使用简单用户名/密码登录方案的小型网络应用。我已经多次注意到,当用户正确输入密码时,它将不允许用户登录。
该代码最初只是在初始注册时加密用户输入的密码:
function encode5t($str) {
for($i=0; $i<5;$i++) {
$str=strrev(base64_encode($str)); //apply base64 first and then reverse the string
}
return $str;
}
$password=mysql_real_escape_string($_POST['password']);
$pass=encode5t($password);
然后将$ pass插入MySQL数据库。然后使用相同的功能 在登录时加密密码,并根据数据库检查密码:
$username = $_POST['username'];
$psw = $_POST['password'];
$npsw=encode5t($psw);
$query = sprintf("SELECT * FROM members WHERE username='%s' AND password='%s'",
mysql_real_escape_string($username),
mysql_real_escape_string($npsw));
问题出现在于密码输入表单的方式。如果只是输入,则没有问题,但如果将密码复制/粘贴到表单中(从包含新生成的密码的电子邮件中),则会失败。加密函数创建并且完全不同的散列并且不匹配,因此用户未登录。
我玩过编码并将其更改为只使用md5(),但我得到了同样的结果 结果 - 剪切/粘贴导致的哈希值不同于只是在表单中键入密码的结果。
页面编码中是否有某些内容可以使复制/粘贴文本与键入的文本不同?
答案 0 :(得分:3)
问题是,当用户粘贴用户名/密码时,它通常在其之前或之后有空格。通过trim()
运行这些字段以解决此问题。
另一方面,你所拥有的并不是那么安全。你的base64字符串不会长时间欺骗任何人,md5不应该用于密码哈希,特别是当没有盐渍时。尝试一些更强大的东西,比如漩涡。最后,我建议使用PDO准备好的查询来避免注入问题。您目前正在逃避您的数据......这太棒了!但是,最好不要冒险在某个地方错过逃生。