• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

проверка логина-пароля по Mysql

  • Автор темы Yankeppey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

Yankeppey

Имеется таблица users в базе данных db, в которой три столбца: id, user и password. Методом get скрипту передаются логин и пароль. Функция должна возвратить true, если пользователь с таким логином-паролем существует, false - если нет.
Сделал такой вариант на php:

function logon() {
global $SERVER, $USER, $PASSWORD, $DB;
$login = $_GET["login"];
$password = $_GET["password"];
$conn = new mysqli($SERVER,$USER,$PASSWORD,$DB);
if (!$conn) return false;
$sql_statement="
SELECT * FROM db.users
WHERE
user LIKE '".$login."'
AND
password LIKE '".$password."';
";
$result = mysqli_query($conn, $sql_statement);
$row = $result->fetch_array();
return $row;
}

В связке php+mysql не работал.
Интересует сам алгоритм проверки. Здесь я как возвращаемое значение послал сам массив $row, который не создастся, если в базе нет записи с таким именем-паролем. Все работает.
Интересует, есть ли какие-нибудь "классические", неформально принятые примеры проверки именя-пароля?
 
V

Vovochka

При отправке пароля использовать POST + Ваш код забавен, попробуйте войти в систему с логином ' OR 1; --, а если в базе данных все разрешено для подключения, то логин '; TRUNCATE TABLE users; -- возымеет еще более интересное действие.

P.S. Да и пароли не хило было бы хранить в виде хешей.
 
Y

Yankeppey

Спасибо большое за дельный комментарий.
Пароли будут храниться в хэшах - пока для наглядности храню просто как есть (чтобы в phpmyadmin смотреть все таблицы напрямую).
По поводу хитрых логинов-паролей - очень интересно, однако... скрипт не рушится :D Кавычка ' воспринимается именно как символ кавычки \' :
SELECT * FROM db.users WHERE user LIKE '\' OR 1; --' AND password LIKE 'abc';

Или здесь дело в клиенте-отправщике запросов?
Ну и как избежать здесь потенциальной угрозы? Обрабатывать login и password разными средствами работы со строками вроде явной замены ' на \'?
Ещё вопрос. Чем POST лучше GET?
Запрос будет отправляться не из браузера, а из мобильника - в данном случае GET чем-то хуже POST? Проблем сделать POST нету (опять же, пока делаю get для наглядности), просто интересно.
 
V

Vovochka

Именно что в приведенном вами варианте экранирования не было. символ ' сам не превращается в \'
На всякие подобные случае в php есть mysql_escape_string()

В браузерах GET не используеться при отправке паролей по причине безопасности. Ибо GET запрос сохраняется в истории браузера и в логах сервера.
Конечно POST тоже в логах находит свое отображение, но в таком случае мы не увидим параметров запроса.
Что будет честнее по отношению к пользователю.
 
Y

Yankeppey

Ага, спасибо, буду копать.
Я понимаю, что в экранирования в моём коде не было, но тем не менее - код не рушился, и при
echo $sql_statement
выводил эту строку, где кем-то уже было заменено ' на \'. Остается только гадать, кем :rolleyes:
 
G

GOsha

Вон nws че-та на эту тему накарябал:
link removed
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!