2010-06-28 124 views
1

更确切地说: 我想检查用户是否输入了与DB中的一个商店相同的密码作为其配置文件。我试过类似的东西,但我没有得到回音:是否有可能检查MD5密码

$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算法总是变化?

回答

6

应该删除md5($ password)附近的那些单引号(')。不,MD5哈希不会改变。

+0

是的正确,在这里犯了一个错误..感谢 – tetris 2010-06-28 06:15:30

+1

...但增加了'$ password'' – 2010-06-28 06:17:21

+0

''md5'($ password)''=>'md5('$ password')',但你应该散列在PHP中的密码不在SQL中:如果出现问题,明文密码将不会在MySQL转储中。请参阅@Babiker答案。 – 2010-06-28 06:18:54

4

呼应,以确保所有瓦尔被填充检查查询字符串:

echo "SELECT emails_password, emails_id FROM lala.in_emails WHERE emails_password ='".md5($password)."' AND emails_id='".$_COOKIE['LALA_ID']."'"; 

你应得到的东西

SELECT emails_password,emails_id FROM lala.in_emails WHERE emails_password ='098f6bcd4621d373cade4e832627b4f6'AND emails_id ='some-emails-id'

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";} 

感谢斯特凡和伊姆雷L用他们的伟大的意见,使这个代码更好

附录: 人们在评论指责我使用转义的MD5 ()函数结果。
我觉得这是为未来的读者解释的好点:

如果您想到每个特定变量的数据源 - 您正在混合图层。
MD5()不做任何“消毒”。这只是一个巧合,它的结果不包含特殊字符。 但是一个人不应该想到这一点!
数据库层应该独立于上下文。它必须是完全抽象的。不管你如何验证你的数据 - MD5,只有拉丁字母,数字等 - 所有这些与数据库层无关。 DB层应该知道数据源和表单的注释。它应该只是执行正确语法的SQL的职责。有一天,验证规则可能会更改 - 对于普通密码,或者某些二进制格式可能包含空字节等。验证规则可能会更改,但数据库规则必须保持不变。

以准备好的语句为例:
您是否决定每个变量,它是否需要绑定?不,你无条件地做,无论它是什么形式。所以,引号中的数据转义应该是。

+3

现在这就是我所说的偏执狂,'mysql_real_escaping'一个MD5散列。 ;) – deceze 2010-06-28 06:33:27

+2

@deceze我分享你的幽默:)但严重:密码存储形式可能会改变。转义字符串必须是严格的规则,没有例外。你不要调用绑定相同的散列占位符偏执? – 2010-06-28 06:38:45

+0

没有什么可以在散列中转义。 使用盐很好。如果你想做得更好,那么你使用hmac和比md5更好的东西:'hash_hmac('ripemd160',$ password,'secretgolobalsalt');' – 2010-06-28 22:08:59

0

1)使用mysql_real_escape_string()转义$ _COOKIE ['LALA_ID']以防止SQL注入。

2)使用散列的强大的版本,像SHA512

3)如果你是这么认为有关保护客户一般密码,那么你可以在客户端哈希密码,并发送哈希服务器。在服务器上再次散列它。

+0

散列在客户端是坏的,你可以然后简单地发送散列(在妥协数据库后) – knittl 2010-06-28 08:19:00

+0

散列在客户端防止通过网络发送明文密码如果您不使用https – codez 2010-06-29 10:07:44

相关问题