0

我有一个使用简单用户名/密码登录方案的小型 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() 但我得到了相同的最终结果 - 剪切/粘贴会产生不同的哈希值,而不是简单地将密码输入到表单中。

页面编码中是否有某些内容会使复制/粘贴文本与键入的文本不同?

4

1 回答 1

3

问题是当用户粘贴用户名/密码时,它的前后通常有空格。运行这些字段trim()以解决此问题。

另一方面,您所拥有的并不是那么安全。您的 base64 字符串不会长时间欺骗任何人,并且 md5 不应用于密码哈希,尤其是在未加盐的情况下。尝试一些更强大的东西,比如漩涡。最后,我建议对 PDO 使用准备好的查询来避免注入问题。您目前正在逃避您的数据……太好了!但是,最好不要冒险错过某个地方的逃生机会。

于 2012-08-12T09:19:02.073 回答