Я просмотрел свой сценарий входа в систему, используя SQL Inject Me Firefox addon
Согласно результатам тестирования, мой скрипт был уязвим для SQL Injection. Результат по примеру
Results: Server Status Code: 302 Found Tested value: 1' OR '1'='1 Server Status Code: 302 Found Tested value: 1' OR '1'='1 Server Status Code: 302 Found Tested value: 1 UNI/**/ON SELECT ALL FROM WHERE Server Status Code: 302 Found Tested value: %31%27%20%4F%52%20%27%31%27%3D%27%31
Мой скрипт
check-login.php – Проверить регистрационную информацию и вот код.
$ email = clean ($ _ POST ['username']); $ pass = clean ($ _ POST ['password']); $ user = "select * from tbl_admin, где admin = '$ email' и pass = '$ pass'";
// некоторый код
$ _SESSION ['login_mes'] = "Вы успешно вошли в систему!"; заголовок ( "Location: admin.php"); Выход();
} else {
$ _SESSION ['login_mes'] = "Недействительный адрес электронной почты или пароль, повторите попытку."; заголовок ( "Location: login.php"); Выход(); }
Проблемы возникли, когда логин завершился неудачно. Если я удалю
} else { $_SESSION['login_mes'] = "Invalid email address or password, please try again."; header("Location:login.php"); exit(); }
Нет ошибок, обнаруженных SQL Inject Me и как исправить эту часть?
302 – это способ сервера сказать «Я хочу, чтобы вы пошли [в другое место]» (в этом случае login.php). Это не ошибка, а вполне нормальный ответ. Особенно в вашем случае имеет смысл (если вы спросите меня) отправить пользователя на страницу входа после попытки SQL-инъекции, чем позволить ему войти.
Четыре года спустя, но я просто рассматривал этот вопрос и думал, что я поделюсь следующим человеком.
После некоторого анализа мы пришли к выводу, что 302 сам по себе не вызывает беспокойства. Конкуренция – это то, что страница предшествовала 302, которая могла быть отправлена, но была сметена 302 до ее отображения. Если предыдущая страница, полученная браузером (и, возможно, записанная Fiddler), содержит ошибки базы данных (или другую информацию, которую может найти хакер), чем это плохо. Если 302 – это начальный отклик, и он имеет пустое тело, просто заголовок, то я думаю, что вы в порядке.
Вы должны отобразить страницу с ошибкой (цель 302), поэтому я не вижу, как это можно считать «слишком большой информацией».
«// некоторый код» мало помогает, но проблема может быть в этом clean()
. mysql_real_escape_string()
этого попробуйте mysql_real_escape_string()
.
Изменить: Как было сказано выше, код 302 означает «вы отправлены». Это не означает, что SQL Injection была успешной, поскольку это не значит, что это тоже не так. В этом случае вы будете знать только, что если вы можете определить, куда отправит этот 302, «admin.php» или «login.php».
Некоторые инструменты тестирования проникновения предпочитают серверы возвращать сообщения об ошибках или, по крайней мере, очень общие сообщения. Например, на странице SQL Inject Me это говорит
Инструмент работает, отправляя строки escape-строки базы данных через поля формы. Затем он ищет сообщения об ошибках базы данных, которые выводятся в визуализированный HTML-страницы.
Поэтому, возможно, когда он видит код ответа 302, он предполагает, что ваше приложение возвращает слишком много информации. Вы можете протестировать эту теорию, установив другой код состояния для вашего ответа и увидев, что SQL Inject Me все еще дает ошибку, например:
header('HTTP/1.1 404 Not Found');
Конечно, отправка им 404 не поможет вашему пользователю вернуться к странице входа, поэтому вам, возможно, придется экспериментировать с другими сообщениями 3XX, возможно, 303 или 307.