更确切地说: 我想检查用户是否为其配置文件输入与数据库中的一个商店相同的密码。我尝试过类似的东西,但我没有回应:
$query2=mysql_query("SELECT emails_password,emails_id FROM lala.in_emails WHERE emails_password ='md5($password)' AND emails_id='".$_COOKIE['LALA_ID']."'")or die(mysql_error());
if(mysql_num_rows($query2)>0){echo "same pass";}
所以也许md5算法总是会改变?
答案 0 :(得分:6)
应删除md5($ password)周围的单引号(')。不,MD5哈希不会改变。
答案 1 :(得分:4)
通过回显检查查询字符串,以确保填充所有变量:
echo "SELECT emails_password, emails_id FROM lala.in_emails WHERE emails_password ='".md5($password)."' AND emails_id='".$_COOKIE['LALA_ID']."'";
您将获得之类的内容:
选择emails_password,emails_id 来自lala.in_emails WHERE emails_password ='098f6bcd4621d373cade4e832627b4f6'AND emails_id ='some-emails-id'
答案 2 :(得分:2)
你的问题是Mysql语法相关,而不是哈希相关 好的做法看起来像这样:
$password = md5($password.$global_salt.$_COOKIE['LALA_ID']);
$password = mysql_real_escape_string($password);
$lala_id = mysql_real_escape_string($_COOKIE['LALA_ID']);
$query = "SELECT emails_password,emails_id FROM lala.in_emails
WHERE emails_password ='$password'
AND emails_id='$lala_id'";
$result = mysql_query($query) or trigger_error(mysql_error().$query);
if(mysql_num_rows($result)>0){echo "same pass";}
感谢Stephane和Imre L的精彩评论,让这段代码变得更好
<强>附录:强> 评论中的人指责我在MD5()函数结果上使用转义 我觉得为未来的读者解释是好事:
如果您考虑每个特定变量的数据源 - 您正在混合图层 MD5()不做任何“消毒”。这只是一个巧合,它的结果不包含任何特殊字符。 但是根本不应该想到这一点! 数据库层应独立于上下文。它必须是完全抽象的。无论您如何验证数据 - MD5,只有拉丁字母,数字等 - 所有这些都与数据库层无关。 DB层应该知道数据源和表单的注意事项。它应该只是执行SQL的正确语法的责任。一天验证规则可能会更改 - 对于普通密码,或某些二进制格式可能包含空字节等。验证规则可能会更改,但数据库规则必须保持不变。
以预备陈述为例:
你决定每个变量,它是否需要绑定?不管 - 你无条件地为每个变量做这件事,无论它是什么形式。因此,转义引号中的数据应该是。
答案 3 :(得分:0)
1)使用mysql_real_escape_string()转义$ _COOKIE ['LALA_ID']以防止SQL注入。
2)使用更强版本的哈希,例如sha512
3)如果您考虑过保护客户端普通密码,那么您可以在客户端散列密码并将哈希值发送到服务器。在服务器上再次哈希。