При правильном использовании достаточно ли специальных символов html для защиты от всех XSS?


Если верны следующие утверждения,

  • Все документы подаются с заголовком HTTP Content-Type: text/html; charset=UTF-8.
  • Все атрибуты HTML заключены в одинарные или двойные кавычки.
  • В документе нет тегов <script>.

Существуют ли какие-либо случаи, когда htmlspecialchars($input, ENT_QUOTES, 'UTF-8') (преобразование &, ", ', <, > соответствующим именованным сущностям HTML) недостаточно для защиты от межсайтовых сценариев при создании HTML на веб-сервере?

Author: Alf Eaton, 2013-10-25

3 answers

htmlspecialchars() этого достаточно, чтобы предотвратить внедрение HTML-кода во время создания документа с указанными вами ограничениями (т. Е. Без внедрения в содержимое тега/атрибут без кавычек).

Однако существуют и другие виды инъекций, которые могут привести к XSS и:

В документе нет тегов

Это условие не распространяется на все случаи инъекции JS. Например, у вас может быть атрибут обработчика событий (требуется JS-экранирование внутри HTML-экранирование):

<div onmouseover="alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!

Или, что еще хуже, javascript: ссылка (требуется JS-экранирование внутри URL-экранирование внутри HTML-экранирование):

<a href="javascript:alert('<?php echo htmlspecialchars($xss) ?>')"> // bad!

Обычно в любом случае лучше избегать этих конструкций, но особенно при создании шаблонов. Писать <?php echo htmlspecialchars(urlencode(json_encode($something))) ?> довольно утомительно.

И... проблемы с внедрением также могут возникать на стороне клиента (DOM XSS); htmlspecialchars() не защитит вас от написания фрагмента JavaScript в innerHTML (обычно .html() в плохих сценариях jQuery) без явного спасаясь.

И... XSS имеет более широкий спектр причин, чем просто инъекции. Другими распространенными причинами являются:

  • Разрешение пользователю создавать ссылки без проверки на наличие заведомо хороших схем URL (javascript: является наиболее известной вредоносной схемой, но есть и другие)

  • Намеренно позволяя пользователю создавать разметку, либо напрямую, либо с помощью схем легкой разметки (например, bbcode, который неизменно можно использовать)

  • Разрешение пользователю загружать файлы (которые могут быть различными способами интерпретированы как HTML или XML)

 14
Author: bobince, 2013-10-25 13:55:58

Предполагая, что вы не используете более старые версии PHP (5.2 или около того), специальные символы html "безопасны" (и, конечно, учитывают внутренний код, как упоминает @Royal Bg)

В более старых версиях PHP были искажены символы UTF-8, что делало эту функцию уязвимой (http://www.securityfocus.com/bid/37389)

Мои 2 цента: просто всегда очищайте/проверяйте свои входные данные, сообщая, что разрешено, вместо того, чтобы просто избегать всего/кодирования все

Т.е. если кто-то должен ввести номер телефона, я могу представить, что разрешены следующие символы: 0123456789()+-. и пробел, но все остальные просто игнорируются/удаляются

То же самое относится и к адресам и т. Д. Кто-то, указывающий символы UTF-8 для точек/блоков/сердец и т. Д. В своем адресе, должен быть психически больным...

 2
Author: Ronald Swets, 2013-10-25 09:17:23

Насколько я знаю, да. Я не могу представить себе случай, когда это не позволяет избежать xss. Если вы хотите быть в полной безопасности, используйте strip_tags()

 -5
Author: Y U NO WORK, 2013-10-25 07:57:18