Строгая проверка HTML и фильтрация в PHP - PullRequest
17 голосов
/ 14 октября 2008

Я ищу лучшие практики для выполнения строгой (белого списка) проверки / фильтрации отправленного пользователем HTML.

Основная цель - отфильтровать XSS и аналогичные программы, которые можно вводить через веб-формы. Вторичная цель состоит в том, чтобы ограничить разрыв содержимого HTML, введенного нетехническими пользователями, например, через WYSIWYG-редактор, который имеет представление HTML.

Я подумываю об использовании HTML Purifier или обкатке своего собственного с помощью анализатора HTML DOM для прохождения процесса, такого как HTML (грязный) -> DOM (грязный) -> фильтр -> DOM ( чистый) -.> HTML (чистый)

Можете ли вы описать успехи с этими или другими более эффективными стратегиями? Любые подводные камни, на которые стоит обратить внимание?

Ответы [ 4 ]

9 голосов
/ 14 октября 2008

Я протестировал все известные мне эксплойты на HTML Purifier, и он работал очень хорошо. Он фильтрует не только HTML, но также CSS и URL.

После сужения элементов и атрибутов до невинных, подводные камни находятся в содержимом атрибутов - javascript: псевдо-URL (IE позволяет использовать символы табуляции в имени протокола - java	script: все еще работает) и свойства CSS, которые запускают JS.

Парсинг URL может быть сложным, например, они действительны: http://spoof.com:xxx@evil.com или //evil.com. Интернационализированные домены (IDN) можно записать двумя способами - Unicode и punycode.

Идите с HTML Purifier - большинство из них проработано. Если вы просто хотите исправить поврежденный HTML, используйте HTML Tidy (он доступен как расширение PHP).

5 голосов
/ 14 октября 2008

Пользовательский HTML-код не всегда действителен или действительно завершен. Браузеры интерпретируют широкий диапазон недопустимого HTML, и вам следует убедиться, что вы можете его перехватить.

Также имейте в виду действительный вид:

<img src="http://www.mysite.com/logout" />

и

<a href="javascript:alert('xss hole');">click</a>
1 голос
/ 14 октября 2008

Я с успехом использовал HTML Purifier, и у меня не было никакого xss или другого нежелательного входного фильтра. Я также запускаю sanitize HTML через расширение Tidy, чтобы убедиться, что он также проверяется.

0 голосов
/ 14 октября 2008

W3C имеет большой пакет с открытым исходным кодом для проверки HTML, доступный здесь:

http://validator.w3.org/

Вы можете загрузить пакет для себя и, вероятно, реализовать все, что они делают. К сожалению, похоже, что многие DOM-парсеры, похоже, готовы изменить правила выделения кода HTML «в дикой природе», поэтому неплохо позволить мастерам рассказать вам, что не так, и не оставлять это более практичный инструмент - существует множество веб-сайтов, которые не являются совершенным, совместимым HTML, но мы все еще используем его каждый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...