【发布时间】:2011-10-18 15:07:24
【问题描述】:
在向数据库插入数据之前,我将用户名和密码加密如下:
$userName=strip_tags($userName);
$pass=strip_tags($pass);
$userName= htmlentities($userName, ENT_QUOTES, 'UTF-8');
$pass= htmlentities($pass, ENT_QUOTES, 'UTF-8');
$userName=mysql_real_escape_string($userName);
$pass=mysql_real_escape_string($pass);
$salt = 'SHIFLETT';
$password_hash = md5($salt . md5($pass.$salt));
这样做是为了防止 SQL 攻击和一般 SQL 注入。
现在我想检查用户在登录时给我的通行证和名称。我重复了转义字符剥离和转义特殊字符的相同过程。 所以这是我检查通行证的功能:
function validateLogin($user_name, $pass)
{
$userName=strip_tags($userName);
$pass=strip_tags($pass);
$userName= htmlentities($userName, ENT_QUOTES, 'UTF-8');
$pass= htmlentities($pass, ENT_QUOTES, 'UTF-8');
$userName=mysql_real_escape_string($userName);
$pass=mysql_real_escape_string($pass);
$salt = 'SHIFLETT';
$password_hash = md5($salt . md5($pass.$salt));
$result=mysql_query("SELECT COUNT(*) AS Result FROM users WHERE user_name='$user_name' AND pass='$password_hash'");
mysql_close();
if($row=mysql_fetch_array($result))
{
if($row['Result']>0)
{
echo "Login successful";
}
else
{
echo "Login unsuccessful";
}
}
}
我的问题是所有这些安全预防措施,验证是否有效?如果我在插入和选择语句上使用相同的 MD5 编码,MD5 会返回相同的传递吗?
【问题讨论】:
-
md5 不是加密。
-
您的 salt 对于每个用户都应该是唯一的,并存储在您的数据库表中。
-
好吧,攻击者不知道什么是盐。盐应该是一些额外的名称“编码”应用程序..不是每个单独的用户
-
使用盐有助于对抗预先计算的哈希,每个用户的不同哈希会为您的数据增加熵,更多的熵 = 更好的安全性。此外,md5(或任何“快速”哈希)对密码不利,bcrypt 是一个更好的选择,安全方面。