).
Рекомендую сначала удалить все HTML-теги, а затем пропустить
полученные извне данные через функцию Htmispeciaichars —для надежности:
$name = strip_tags($name);
$name = Htmispeciaichars($name);
Второй параметр функции striptags о позволяет указать список
разрешенных HTML-тегов, например:
$name = strip_tags($name,f
f);
Но я настоятельно не рекомендую разрешать какие-либо HTML-теги, даже
самые безобидные, вроде и .
В дополнение к этому желательно работать с переменными так, будто бы
директива registergiobais отключена. Так вы сможете контролировать
способы поступления информации, например, только по методу get:
$name = $_GET [' namef ] ;
Ведь при включенной директиве registergiobais в РНР нет разницы, как
был передан параметр: с помощью метода get или post. А злоумышленник
может специально передать данные методом post, чтобы его запрос не был
внесен в журнал сервера. Если вы сами контролируете способ передачи
данных, то данную ситуацию можно исключить.
Глава 18. Защита собственной CMS 219
18.4. SQL-инъекции
SQL-инъекции по своей природе очень похожи на XSS-атаки и различаются
только деталями. Цель XSS-атаки — выход за пределы HTML-тега, а SQL-
инъекции — внедрение SQL-кода, что может привести к краже информации
и даже к полному уничтожению базы данных.
Рассмотрим тривиальный пример SQL-инъекции. Предположим, что у нас
есть таблица users, содержащая информацию о пользователях:
id int(ll) NOT NULL auto_increment,
login tinytext,
password tinytext,
email tinytext,
PRIMARY KEY (id_user)
Авторизацию пользователя выполняет сценарий login.php (листинг 18.1).
//В файле config.php — параметры соединения с сервером MySQL
include «config.php»;
// Подключаемся к серверу
mysql_connect($SERVER, $USER, $PASSWORD);
mysql_select_db($DB);
// Сценарию через форму передаются две переменные: $login и $pass
// Если в таблице users будет запись, поле login которой содержит
// значение, равное значению переменной $login, и поле password
// содержит значение, равное значению переменной $pass, то результат
// данного запроса будет содержать одну строку, в противном случае
// число строк результата будет равно нулю
$query = «SELECT * FROM users
WHERE login = \»$login\» AND password = \»$pass\»";
// Выводим для отладки запрос — чтобы вы видели, что происходит
echo $query;
$r = mysql_query($query);
220
Часть IV. Разработка собственной CMS
if(mysql_num_rows($r)>0)
{
echo «аутентификация прошла успешно»;
}
else echo «
access denied»;
?>
Нашему сценарию нужно передать два параметра— $iogin и $pass. Форма
для передачи этих параметров может выглядеть так:
Предположим, что в нашей таблице есть пользователь admin с паролем 123.
Если ввести эти имя пользователя и пароль, то мы увидим в окне браузера
следующий текст:
SELECT * FROM users WHERE login = «admin» AND password = «123″
аутентификация прошла успешно
Все как бы работает правильно. Теперь вместо имени пользователя введем
admin»/*, а пароль вообще не будем указывать. В окне браузера увидим
(рис. 18.1):
SELECT * FROM users WHERE login = «admin»/*» AND password = «»
аутентификация прошла успешно
Получается интересная ситуация: вместо имени пользователя ввели строку,
только отчасти похожую на нужную, пароль вообще не указали, а сценарий
пишет, что авторизация прошла успешно.
Рис. 18.1. Результат SQL-инъекции
Глава 18. Защита собственной CMS _ 221
Оказывается, ничего сверхъестественного не произошло. Вы только
взгляните на наш SQL-запрос:
SELECT * FROM users WHERE login = «admin»/*» AND password = «»
На самом деле он выглядит так:
SELECT * FROM users WHERE login = «admin»
Символы /* считаются началом комментария, поэтому все, что находится
после них, не учитывается. На самом деле получается, что наш запрос просто
запрашивает строку, содержащую информацию о пользователе admin.
Поскольку у нас есть пользователь с таким именем, то число строк результата
будет больше нуля, следовательно, сценарий «радостно» сообщит нам, что
аутентификация прошла успешно
Выходит, все, что необходимо знать злоумышленнику, — это имя
пользователя, которого нужно «взломать».
Что же нам делать? Во-первых, следует изменить алгоритм проверки имени
пользователя и пароля.
5th Фев 2011
|
Теги:
|