Строгая проверка и фильтрация HTML в PHP

17

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

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

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

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

    
задан Barry Austin 13.10.2008 в 23:00
источник

4 ответа

9

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

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

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

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

    
ответ дан Kornel 13.10.2008 в 23:39
  • ... hint: htmlpurifier.org –  BlaM 13.10.2008 в 23:41
  • Спасибо за ваш ответ! –  Barry Austin 16.10.2008 в 23:39
  • Оказывается, в 2008 году это было далеко не безопасно, эти подвиги были найдены в 2011 году: secunia.com/advisories/43907, 2010: secunia.com/advisories/39613 Урок: обязательно обновляйте установку фильтра. –  Cheekysoft 01.09.2011 в 15:11
5

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

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

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

и

<a href="javascript:alert('xss hole');">click</a>
    
ответ дан Ross 13.10.2008 в 23:19
  • Спасибо Росс, это отличные примеры видов ввода, которые следует отфильтровать. Но ответ, который я ищу, также будет включать методы и решения. –  Barry Austin 14.10.2008 в 16:52
  • Первый пример (который является ссылкой на статью codinghorror: codinghorror.com/blog/archives/001171.html) не имеет особого значения, поскольку «дыра» зависит от характера этого URL-адреса, а не от синтаксиса этот фрагмент HTML. –  Bobby Jack 14.10.2008 в 17:26
  • Есть еще полезные правила, которые могут быть применены к первому, например, «allow <img> tag только тогда, когда атрибут src соответствует регулярному выражению / ^ http: \ / \ / localsite.com \ / uploaded_images \ / [ \ ш -] * \ (PNG | JPG | GIF) $ / я».. –  Barry Austin 14.10.2008 в 18:21
1

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

    
ответ дан Oscar M. 14.10.2008 в 00:08
-1

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

Ссылка

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

    
ответ дан Robert Elwell 13.10.2008 в 23:35
  • Валидация против DTD вообще не защищает от XSS. –  Kornel 13.10.2008 в 23:40
  • Точно, я не думаю, что это означает, что Барри имел в виду валидацию - считайте проверку данных или скрининг, а не проверку стандартов. Это могло бы помочь против искаженного HTML, хотя;) –  Ross 13.10.2008 в 23:42