php密码检查

时间:2012-08-12 09:17:17

标签: php

我有一个使用简单用户名/密码登录方案的小型网络应用。我已经多次注意到,当用户正确输入密码时,它将不允许用户登录。

该代码最初只是在初始注册时加密用户输入的密码:

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(),但我得到了同样的结果 结果 - 剪切/粘贴导致的哈希值不同于只是在表单中键入密码的结果。

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

1 个答案:

答案 0 :(得分:3)

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

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

相关问题