所以,这是一个例子。
$id=5;
SELECT * FROM table WHERE userhash=$id
userhash
是VARCHAR
类型,包含未经授权用户的md5哈希值和授权用户的号码(ID' s)。
存在某种碰撞或者我真的不知道关于方程式和md5的事情,但查询返回从userhash='5c4efba7d5b8de6ce81f3fa2c7fcd4d8'
的行检查结果。
答案 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
}