【发布时间】:2011-10-19 10:34:29
【问题描述】:
我有这个语句从数据库中取出输出:
function ValidateLogin($user_name, $pass)
{
$user_name=SanitizeString($user_name);
$pass=SanitizeString($pass);
$user_name=mysql_real_escape_string($user_name);
$pass=mysql_real_escape_string($pass);
$salt = 'SHIFLETT';
$password_hash = hash('sha256',$salt.hash('sha256', $pass));
$result=mysql_query("SELECT * FROM users WHERE user_name='$user_name' AND pass='$password_hash' LIMIT 1") or die(mysql_error());
$dataArray=FALSE;
if(mysql_num_rows($result))
{
echo "Login successful".mysql_num_rows($result);
return $dataArray=TRUE;
}
else
{
echo "Login unsuccessful:".mysql_num_rows($result);
}
return $dataArray;
mysql_close();
}
消毒功能是:
function SanitizeString($var)
{
$var=stripslashes($var);
$var=htmlentities($var, ENT_QUOTES, 'UTF-8');
$var=strip_tags($var);
$var=trim($var);
return $var;
}
注意插入我使用相同的哈希算法。 ...我在这里得到的总是零:echo "Login unsuccessful:".mysql_num_rows($result);
是mysql语句错误..还是哈希算法?还是 sanitizeString 函数?
更新:
结果: 在 $pass 被散列之前,我得到了这个:
string(5) "Mad24"
string(1) "1"
当我插入名称并传递给数据库时。我明白了:
string(5) "Mad24"
string(8) "luckyd55"
这也是在用户的插入和登录过程中对 pass 进行哈希处理之前。为什么我登录时得到1?!?!?
\
登录表单
echo '
<form action="" method="POST">
<table width="80%" border="1" cellpadding="10" id="navigationBar">
<tr>
<td> <a href="StoredProcedure/User/Registration.php">Register</a></td>
<td> <a href="/PoliticalForum/controlPanel.php">Control Panel</a></td>
<td> <a href="/PoliticalForum/checkEmail.php">Donate</a> </td>
<td align="right">name:<input name="name" type="text" /></td>
<td>password:<input name="pass" type="password" /> <input name="login" type="submit" value="Login" /> </td>
</tr>
</table>
</form>
';
【问题讨论】:
-
不是答案,但看起来您对所有用户/密码使用相同的盐。您应该为插入数据库的每个密码创建一个随机盐。
-
var_dump($user_name, $password_hash)并检查它们是否与数据库中的值完全相同。 -
乍一看,我看不出这里涉及的逻辑有任何重大缺陷。我的建议:尝试回显您在 SQL 语句中使用的参数
$user_name和$password_hash,以确定它们是否正确形成。尝试清理密码时应特别小心,但如果在整个应用程序中都严格执行此操作,这应该不是问题。 -
@PeeHaa 实际上他没有使用相同的盐,因为他正在向其中添加实际密码的 sha256。 真正的随机盐会更好,但这个解决方案还不错。
-
你有什么问题?