从数据库中选择时的数字到md5等式

时间:2014-05-26 20:02:50

标签: php mysql md5

所以,这是一个例子。

  • 变量:$id=5;
  • 查询:SELECT * FROM table WHERE userhash=$id

userhashVARCHAR类型,包含未经授权用户的md5哈希值和授权用户的号码(ID' s)。

存在某种碰撞或者我真的不知道关于方程式和md5的事情,但查询返回从userhash='5c4efba7d5b8de6ce81f3fa2c7fcd4d8'的行检查结果。

2 个答案:

答案 0 :(得分:4)

您正在将数字与字符串进行比较,因此基本上正在进行

WHERE 5 = 5c4efba7....

MySQL会#34;礼貌地"尽可能将该字符串转换为数字。根据其规则,它将从字符串的开头到第一个NON数字的所有数字,这意味着你最终做了

WHERE 5 = 5

如果你想比较哈希值,你应该把它作为字符串:

mysql> select '5' = '5ca...', 5 = '5ca...';
+----------------+--------------+
| '5' = '5ca...' | 5 = '5ca...' |
+----------------+--------------+
|              0 |            1 |
+----------------+--------------+
1 row in set, 1 warning (0.00 sec)

请注意引用的版本不匹配(result = 0),而未引用/整数版本的DOES匹配(结果= 1)。

您也可以直接比较hash-to-hash:

WHERE md5(5) = '5ca....'

同样,请注意上面的查询产生了警告:

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '5ca...' |
+---------+------+--------------------------------------------+

答案 1 :(得分:0)

对于授权用户,它应为SELECT * FROM table WHERE userhash='$id',对于未经授权的用户,则为SELECT * FROM table WHERE userhash=md5($id)

因此,您可以按照以下方式执行此操作:

$auth = "SELECT * FROM table WHERE userhash='$id'";
$unauth = md5($id);
$unauth = "SELECT * FROM table WHERE userhash='$unauth'";

if(!empty(mysql_query($auth)) || ($q = mysql_query($auth))){
    //user is authorized and $q has selected row(s)
}else if(!empty(mysql_query($unauth)) || ($q = mysql_query($unauth))){
    ////user is unauthorized and $q has selected row(s)
}else{
    //there was an error with selecting
}