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

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

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

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

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

Я тестировал все эксплоиты, которые я знаю в 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 – он имеет большинство из этих разработанных. Если вы просто хотите исправить неисправный HTML, используйте HTML Tidy (он доступен как расширение PHP).

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

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

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

а также

 <a href="javascript:alert('xss hole');">click</a> 

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

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

http://validator.w3.org/

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