Я храню хеш-файл md5 как в файле cookie, так и в базе данных. У меня есть функция, validate_cookie()
, которая читает этот файл cookie и запрашивает базу данных, чтобы найти пользователя, связанного с этим хэшем.SQL-запрос последовательно выбирает несоответствующую строку
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
это поле ИНТ и все email
проходит проверки, единственный ряд, который должен быть выбран из этот запрос - это те, у которых есть соответствующее поле cookie
.
Однако, если вы вызываете этот запрос из PHP-скрипта или вручную из PHPMyAdmin, он всегда будет выбирать как целевую строку, так и другую: тестовый пример, который имеет только NULL
в поле cookie
. Изменение хэша слегка (так, чтобы оно не должно было ничего сопоставлять) по-прежнему выбирает этот же тестовый пример.
Является ли мой запрос искаженным способом, который я не понимаю? Есть ли какие-то тайные использования OR
, которые позволяют сопоставлять поля NULL
? Любая помощь будет оценена по достоинству.
P.S. Прежде чем мне расскажут, что я действительно должен использовать mysqli
, да, я это знаю. mysql
- это приказы босса.
Испытание случае имеет 'NULL' для всех трех из этих полей или только для поля cookie? Учитывая, что любой результат ввода в одном и том же тестовом случае, должно выполняться условие, которое выполняется. 'OR' требует выполнения одного из трех условий, которые вы указали. –
Используйте ограничение 1, молодой. – Hackerman
вы сказали, что у него есть «cookie = null», но что находится в поле «id» и «email» неправильно подобранной строки? –