Joomla портал
seo seo Subscribe
seo
0
seo

).

Рекомендую сначала удалить все 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. Форма

для передачи этих параметров может выглядеть так:

Login

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.

Поскольку у нас есть пользователь с таким именем, то число строк результата

будет больше нуля, следовательно, сценарий «радостно» сообщит нам, что

аутентификация прошла успешно

Выходит, все, что необходимо знать злоумышленнику, — это имя

пользователя, которого нужно «взломать».

Что же нам делать? Во-первых, следует изменить алгоритм проверки имени

пользователя и пароля.

seo
5th Фев 2011
Теги:
seo

Написать ответ

seo
 
Все права защищены © 2023 Joomla портал
 
 
seo