Mysql Ошибка в коде авторизации

Aleks_Tsygan

Новичок
Ребята, подскажите, пожалуйста, что в следующем коде "не так"? Есть ли какие-то ошибки?

PHP:
<?
if(strlen(trim($_REQUEST["LOGIN"]))>1 and strlen(trim($_REQUEST["PASSWORD"]))>1)
$db_q=mysql_query('SELECT * FROM b_user WHERE LOGIN=$_REQUEST["LOGIN"] 
AND PASSWORD=$_REQUEST["PASSWORD"] LIMIT 1');

if(mysql_fetch_row($db_q)){
$my_USER->AuthorizeByLogin($_REQUEST["LOGIN"]);
}
?>
Дело в том, что я пока только изучаю азы php и my_sql, и на поиск ответа на данный вопрос у меня уйдёт куча времени, а вопрос очень "горячий", поэтому рассчитываю на вашу квалифицированную помощь! Помогите, пожалуйста!
 

Aleks_Tsygan

Новичок
Спасибо за ссылки!

Поизучав информацию, выделил несколько моментов:

а) Название переменных, таблиц, полей и литералов лучше писать строчными буквами
б) Имена полей и таблиц рекомендуется заключать в обратные одинарные кавычки
в) В первой строке кода функцию strlen() и сравнение с единицей можно не использовать
г) Ошибка в синтаксисе запроса mysql – строковые значения должны быть обрамлены в кавычки. Следовательно, вместо login=$_REQUEST[“login”] нужно писать login='{$_REQUEST['login']}'
д) Запрос уязвим для sql-инъекций, поэтому данные нужно экранировать

Опираясь на приведённые выше замечания, код можно переписать следующим образом:
PHP:
if (trim($_POST['login']) and trim($_POST['password'])) {
    $login = mysql_real_escape_string($_POST['login']);
    $password = mysql_real_escape_string($_POST['password']);
    $db_q = mysql_query ("SELECT * FROM `b_user` WHERE `login` = '$login' AND `password` = '$password' LIMIT 1");
}
Да, и, если честно, код у меня почему-то так и не заработал с $_REQUEST[“login”] и $_REQUEST[“password”]. Почему, пока не понял.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Наверное, потому, что надо посмотреть, что у тебя там лежит в твоем массиве.
 

Aleks_Tsygan

Новичок
Наверное, потому, что надо посмотреть, что у тебя там лежит в твоем массиве.
В массиве лежит вот это: Array ( [login] => vasya [password] => 12345 [submit] => Войти ). Я так понимаю, это то, что нужно. При вводе этого логина и пароля должно выскакивать сообщение об успешной регистрации. Так оно и происходит, если использовать исправленный код, т.е. с обычными переменными, но не с REQUEST (или POST - и так и так не работает). В чём тогда разница, если сразу указать данные из заголовка, т.е. REQUEST, или сослаться на них через переменную...?
 

Aleks_Tsygan

Новичок
Если в mysql запросе я пишу в качестве значений полей login и password таблицы b_user обычные переменные, которые содержат в себе данные из $_POST, то такой код работает и выводится сообщение об успешной авторизации:
PHP:
$login = mysql_real_escape_string($_POST['login']);
$password = mysql_real_escape_string($_POST['password']);
$db_q = mysql_query ("SELECT * FROM `b_user` WHERE `login` = '$login' 
AND `password` = '$password' LIMIT 1");
Если же вместо обычных переменных указать переменные окружения, например, $_POST['login'], или $_REQUEST['login'], то такой код почему-то не работает, т.е. не выводится сообщение об успешной авторизации:
PHP:
$query = mysql_query("SELECT * FROM `users`  WHERE `login`='{$_POST['login']}' 
AND `password`='{$_POST['password']}' LIMIT 1");
В переменных $_REQUEST и $_POST содержится следующий массив:
Array ( [login] => vasya [password] => 12345 [submit] => Войти )
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Aleks_Tsygan
А теперь берем в руки редактор и выводим то, что у тебя в запросе на экран. То есть пишем echo ... и тут то, что у тебя в mysql_query стоит. Дальше смотрим на экран, и в зависимости от увиденного - действуем. Просто так ничего не ломается никогда.
 

Aleks_Tsygan

Новичок
c0dex, последовав твоему совету, понял, что дело всё в кодировке md5. При регистрации пользователя vasya его пароль кодировался, поэтому, указывая в запросе mysql переменные заголовков $_REQUEST и $_POST, код не работал, т.к. из них поступал обычный, не закодированный пароль. Зарегистрировав нового пользователя без кодировки md5 всё заработало и с обычными переменными и с переменными заголовков.
В общем, разобрался. :) c0dex, спасибо большое! Отличный совет! :)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Aleks_Tsygan
Надо было не убирать md5, а дописать вызов этой функции в запросе...
 
Сверху