Статьи ⇒ PHP ⇒ Преобразование HTML-кода (htmlspecialchars)

Преобразование HTML-кода (htmlspecialchars)

Опубликовано: 19 май 2011 в 11:52
Автор: Jakub Vrana  Перевод: freeeeez 

Межсайтовый скриптинг (XSS) является одним из наиболее распространенных уязвимостей в веб-приложениях. Однако защититься от этой атаки довольно просто — достаточно изменить символы <, > и &, которые непосредственно влияют на HTML-страницу. Если же нужно передать атрибуты тэгов, нужно экранировать кавычки: " и '.

В PHP это можно сделать с помощью функции htmlspecialchars, которая кодирует приведенные выше символы (для преобразования кавычек следует использовать атрибут ENT_QUOTES):

<?php
$text = htmlspecialchars('<a href="#">link</a>', ENT_QUOTES);
echo $text; 
?>

Функция htmlspecialchars() преобразует < в &lt; и > в &gt;, двойная кавычка становится &quot;, а одинарная &#039;. Тем самым исключается возможность внедрения скриптов или ссылок на страницу, а также изменение структуры HTML-кода.

Следует отметить, что у страницы должна быть указана кодировка в Content-Type, иначе может использоваться другой набор символов, которые имеют другие значения (например, UTF-7).

Функция htmlentities идентичная функции htmlspecialchars, но она заменяет все возможные HTML-сущности. Она может быть использована со старыми кодировками, но с Unicode ее обычно не используют.

Автоматическое экранирование

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

Конечно лучше было бы автоматизировать процесс экранирования HTML-кода. Большинство современных CMS предлагают автоматическое преобразование печатных данных. Например, в Smarty есть переменная $default_modifiers, в которую можно добавить фильтры для экранирования кода. Чистый PHP такой возможности не представляет.

Nette Latte фреймворк

Nette Latte — это шаблонизатор автоматического распознавания контекстного содержания:

  • HTML-текст
  • Атрибуты HTML-тэгов и их значения
  • Теги <script> и <style> в CDATA
  • HTML-комментарии

Данный фреймворк позволяет избежать многих проблем с обработкой большого и сложного кода: 


<script type="text/javascript">
var userId = {$userId};
</script>
<p style="color: {$color};" title="{$title}">
<a href="" onclick="return !confirm({$message});">{$desc}</a>
</p>
<!-- Executed in: {$time} s -->

Выводы

Избежать XSS атак довольно просто, достаточно не забывать использовать htmlspecialchars(). Но если это сложно для вас, можете использовать системы автоматической фильтрация данных, например Nette Latte. Эти методы должны с большой вероятностью исключить возможности XSS.

 

Источник: PHP Security внешняя ссылка
Тэги:  •  • 
2 комментария
15 033 просмотра


#1 денис, 18 авг 2011 в 10:03
htmlentities вроде бы лучше чем htmlspecialchar
#2 денис, 18 авг 2011 в 10:04
аа, все.. не увидел сразу

Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.