我在 cookie 和数据库中都存储了一个 md5 哈希。我有一个函数,validate_cookie()
它读取此 cookie 并查询数据库以查找与此哈希关联的用户。
validate_cookie()
调用另一个函数get_user_data()
来进行实际查询。get_user_data()
被其他一些函数和脚本调用,所以它发送的查询非常笼统。这是功能:
function get_user_data($info,$password=Null,$source=Null)
{
if(!$source)
{
$query = "SELECT * FROM `users` WHERE `id` = '".mysql_real_escape_string($info)."' OR `email` = '".mysql_real_escape_string($info)."' OR `cookie`='".mysql_real_escape_string($info)."'"; //Check to see if $info matches any column
}
else { $query = "SELECT * FROM `users` WHERE `".mysql_real_escape_string($source)."_token` ='".mysql_real_escape_string($info)."'";} //we got a social token
$result = mysql_query($query);
if($result)
{
$row = mysql_fetch_array($result);
if($password)
{
if(crypt($password, $row['password']) == $row['password']) //password matching
{
return $row;
} else {return "Password does not match!";}
}
else { return $row; }
}
else { return "Could not get result from database!";}
}
在这种情况下,重要的查询位于if(!source){}
块内。随着validate_cookie()
调用方式,get_user_data()
这个查询变成了(我已经测试过它确实变成了这个):
SELECT * FROM `users` WHERE `id` = '8sd8sdvsasdliwerhnbzo823' OR `email`='8sd8sdvsasdliwerhnbzo823' OR `cookie`='8sd8sdvsasdliwerhnbzo823'
因为id
是一个 int 字段,并且其中的所有内容email
都经过验证,所以应该从此查询中选择的唯一行是具有匹配cookie
字段的行。
NULL
但是,无论是从 PHP 脚本调用此查询还是从 PHPMyAdmin 手动调用,这将始终选择目标行和另一行:仅在其cookie
字段中的测试用例。稍微改变哈希(这样它根本不应该匹配任何东西)仍然选择相同的测试用例。
我的查询是否以我无法理解的方式格式错误?是否有一些神秘的用途OR
可以NULL
匹配字段?任何帮助,将不胜感激。
PS 在我被告知我应该真正使用之前mysqli
,是的,我知道这一点。mysql
是老板的命令。