我有一个使用简单用户名/密码登录方案的小型 Web 应用程序。我已经多次注意到,当用户正确输入密码时,它不允许用户登录。
该代码最初只是将用户在初始注册时输入的密码加密为:
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() 但我得到了相同的最终结果 - 剪切/粘贴会产生不同的哈希值,而不是简单地将密码输入到表单中。
页面编码中是否有某些内容会使复制/粘贴文本与键入的文本不同?