2009-11-19 27 views
2

我试图从我的php页面跨越md5函数来验证mysql上的一对数据列。
我已经加密的字符串的“HelloWorld”用PHP MD5功能,并试图将其与MYSQL MD5功能比较,但它不会工作。
我这样做是因为在数据库中有一对字符串“你好”“世界”需要与我的PHP字符串进行比较,所以:从php md5字符串检查MySql中的字段

<?php 
$str_a = "hello"; 
$str_b = "world"; 
$str_encrypted = md5 ($str_a.$str_b); 

// note "first_col" is "hello" and "second_col" is "world" 
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE MD5(CONCAT(first_col,second_col)) = '$str_encrypted' LIMIT 1;"; 
$res = mysql_query ($sql) or die (mysql_error()); 

($res) ? print "true" : print "false"; 
?> 

此代码返回我的不实,并且数据库没有更新检查列,但不是mysql_error问题被返回。

请问md5 from php从MYSQL生成一个不同的MD5

一个朋友写了一个类似的代码工作在同一个服务器上,但我没有太多的经验,看看那里的区别是

有人可以解释我在哪里,我错了?
谢谢!

+2

不知道你的问题是什么,但我会选择一个更透明的调试手段。自己验证每个过程的各个部分,而不是假设事情按照您的预期工作。因此,首先输出$ str_a。$ str_b和CONCAT(first_col,second_col),并确保它们是相同的输入,如您所期望的那样。然后MD5他们两个,并在视觉上验证他们是否评估相同的事情......等等,这样你就可以按照预期的方式验证事情的每一步。 – 2009-11-19 16:51:07

+0

谢谢,如果你认为查询应该工作,我会从头开始重新检查! – vitto 2009-11-19 16:58:56

+1

P.S.我听说MD5现在几乎是一个破解的加密(至少如果你不种子散列或者你没有像md5(md5(md5('password'))))这样嵌套的md5调用,那么请记住,使用裸md5()函数调用可能比安全加密更适合清理数据存储,您可能需要使用其他方法。 – Kzqai 2009-11-19 17:02:12

回答

5

我不会混合&匹配MD5函数。考虑任何md5功能可能更简单,单向街道。所以修改它为:

$str_concat = $str_a.$str_b; 

// note "first_col" is "hello" and "second_col" is "world" 
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE 
    MD5(CONCAT(first_col,second_col)) = MD5('$str_concat') LIMIT 1;"; 

或者只是为了简单起见而精确地进行sql匹配。

// Skip the php concatenation. 

// note "first_col" is "hello" and "second_col" is "world" 
$sql = "UPDATE `my_table` SET `checked_col` = '1' WHERE 
    MD5(CONCAT(first_col,second_col)) = MD5(CONCAT('$str_a','$str_b')) LIMIT 1;"; 
+0

这是一个伟大的想法,我没有!
不幸的是,我不能因为我的PHP MD5串从像一个激活代码的电子邮件来使用这个聪明的解决方案,所以我需要用PHP MD5第一隐藏的字符串,通过电子邮件发送,然后从查询页面检查。 – vitto 2009-11-19 16:57:13

0

尝试运行以下查询:

SELECT MD5(CONCAT(first_col,second_col)) 
FROM mytable 
WHERE first_col = 'hello' 
     AND second_col = 'world' 

,并确保它返回fc5e038d38a57032085441e7fe7010b0

还需要检查的MD5的情况下,通过PHPMySQL匹配返回。

1

MD5MySQL将返回不同的散列的唯一方法,然后在PHPMD5功能如果MySQLcharacter set是不同的。

0

很可能您的$ res是错误的,因为没有什么可更新。如果以前运行过SQL命令并更新了该行,如果checked_col仍然为1,它将不会再次更新。由于mysql_query没有更新任何内容,因此它将返回false。

您可以包含一个where子句来忽略以前检查过的(有效的)行。

您可能不想使用更新结果来确定验证是否成功,也许您想使用select来代替。

0

**我发现的唯一的解决方案是使用PHP的函数库,这样的MD5哈希一部分,当你的哈希比较它的工作原理数据库中插入密码(或更新表)。所有其他尝试将来自php的md5哈希与mySQL的md5函数匹配失败。

如果有人知道为什么(我相信老版本的PHP和MySQL不存在这个问题)发生这种情况,我很想知道 - 感谢,里克