PHP SQL
PHP SQL .ru
  Главная  Уроки  PHP  MySQL  jQuery  RegEx  CSS  Книги  Форум  
 Функции


  На главную

  Назад  Вперед

  Печать

Предотвращение XSS-атак

XSS означает кросс-сайтовый скриптинг. В отличие от большинства атак, уязвимость работает на стороне клиента. В большинстве случаев XSS-атак помещается некоторый JavaScript-код, позволяющий красть данные, хранящиеся в Cookies пользователя. Поскольку большинство сайтов используют Cookies и сессии для идентификации посетителей, украденные данные могут использоваться, чтобы войти под именем скомпрометированного пользователя. В этом нет ничего страшного, если украдены данные обычного пользователя, и очень опасно, если похищены данные учетной записи администратора. Если вы не используете Cookies или сессии на вашем сайте, ваши пользователи не подвержены этой атаке.

В отличие от атак MySQL Injection, XSS-атаки довольно сложно предотвратить. Крупнейшие сайты вроде Yahoo!, eBay, Apple и Microsoft были атакованы XSS. Хотя атака не подразумевает использования РНР, вы можете использовать РНР для предотвращения атак. Чтобы остановить XSS-атаку, вы можете фильтровать данные, передаваемые пользователем на ваш сайт. По этой причине на большинстве форумов запрещено использовать чистый HTML-код, а вместо него используется так называемый ВВ-код, который намного безопаснее HTML и позволяет использовать теги форматирования, например [Ь] и [linkto]. Давайте рассмотрим небольшой сценарий, иллюстрирующий, как предотвратить некоторые подобные атаки. Для большей защиты нужно использовать полноценное решение вроде SafeHTML, который будет описан чуть позже в этой главе.

function transform_HTML($string,  $length = null)   { // Помогаем предотвращению XSS-attacks
// Обрезаем "мертвые" пробелы $string = trim($string);
// Предотвр. потенциальные проблемы использ. Unicode-кодировки
$string = utf8_decode($string) ;
// Преобразуем HTML-специфические символы в HTML-литералы. 
$string = htmlentities($string,  ENT_NOQUOTES); 
$string = str_replace("#",  "#",  $string) ; 
$string = str_replace("%",  "%",  $string); 
$length = intval($length);
if  ($length > 0)   {
$string = substr($string,  0,  $length);
}
return $string;
}
Данная функция преобразует HTML-специфические символы в HTML-литералы. Браузер отобразит любой HTML-код, обработанный этим сценарием, как текст без разметки. Например, рассмотрим следующую HTML-строку:
<STRONG>Bold Text</STRONG>
Обычно этот HTML-код был бы отображен так: Bold Text После того как мы «скормим» этот код функции transform_HTML (), код будет отображен как есть, хотя на самом деле символы <, > и & были преобразованы в литералы <, > и &. Если просмотреть текст в режиме просмотра исходного кода страницы, мы увидим следующий текст:
Sit;STRONG>Bold Text</STRONG>
Преобразованием специальных HTML-символов в литералы занимается функция htmllentities(). Хотя эта функция позволяет предотвратить большинство атак, опытные XSS-хакеры могут преобразовывать свои вредоносные скрипты в шестнадцатеричный код или в UTF-8 вместо обычного ASCII-текста, что позволяет обойти наши фильтры. Вот пример передачи переменной variable (методом GET) строки, заданной в шестнадцатеричном виде:
<а href="http://host/a.php?variable=%22%3e %3c%53%43%52%49%50%54%3e%44
^6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52
%49%50%54%3e">
В браузере мы увидим следующий вывод:
<а href="http://host/a.php?variable="> <SCRIPT>Dosomethingmalicious</SCRIPT>
Чтобы предотвратить такой поворот событий, функция transform_HTML () дополнительно конвертирует знаки # и %, что предотвращает шестнадцатеричную XSS-атаку и конвертирует UTF-закодированные данные.

В заключение отмечу, что, если кто-то пытается указать слишком длинную строку, надеясь вызвать переполнение буфера, вы можете установить пара-метр $ length, позволяющий сократить строку до нужной вам длины.

 
Предыдущая   На главную   Следующая          

Ваш комментарий:

'

Реклама на сайте | Обмен ссылками | Ссылки | Контакты
Добавить статью | Добавить исходник
2010-2014 © phpsql.ru