Строгая проверка и фильтрация HTML в PHP
Я ищу наилучшие методы для выполнения строгой ( "белого" ) проверки/фильтрации предоставленного пользователем HTML.
Основная цель - отфильтровать XSS и аналогичные nasties, которые могут быть введены через веб-формы. Вторичная цель - ограничить поломку содержимого HTML, введенного нетехническими пользователями, например. через редактор WYSIWYG, который имеет вид HTML.
Я рассматриваю возможность использования HTML-очистителя или сворачивания моего собственного с помощью HTML-анализатора DOM для прохождения процесса, такого как HTML (грязный) → DOM (немытый) → фильтр- > DOM (чистый) -. > HTML (чистый)
Можете ли вы описать успехи этих или любых более простых стратегий, которые также эффективны? Любые подводные камни, за которыми следует следить?
Ответы
Ответ 1
Я тестировал все эксплоиты, которые я знаю на очистителе HTML, и это было очень хорошо. Он фильтрует не только HTML, но также CSS и URL-адреса.
Как только вы сужаете элементы и атрибуты невинных, подводные камни находятся в содержимом атрибутов - псевдо-URL-адреса javascript:
(IE позволяет использовать символы табуляции в имени протокола - java	script:
) и свойства CSS, которые запускают JS.
Анализ URL-адресов может быть сложным, например. они действительны: http://spoof.com:[email protected]
или //evil.com
.
Интернационализированные домены (IDN) могут быть записаны двумя способами: Unicode и punycode.
Пойдите с очистителем HTML - он имеет большинство из них. Если вы просто хотите исправить неисправный HTML, используйте HTML Tidy (он доступен как расширение PHP).
Ответ 2
Представленный пользователем HTML не всегда действителен или действительно завершен. Браузеры будут интерпретировать широкий диапазон недопустимых HTML, и вы должны убедиться, что можете его поймать.
Также обратите внимание на действительный вид:
<img src="http://www.mysite.com/logout" />
и
<a href="javascript:alert('xss hole');">click</a>
Ответ 3
Я использовал HTML Purifier с успехом и не имел никакого xss или другого нежелательного входного фильтра. Я также запускаю sanitize HTML через расширение Tidy, чтобы убедиться, что он также проверяет.
Ответ 4
W3C имеет большой открытый исходный пакет для проверки HTML, доступного здесь:
http://validator.w3.org/
Вы можете загрузить пакет для себя и, возможно, реализовать все, что они делают. К сожалению, кажется, что многие парнеры DOM, похоже, готовы сгибать правила, чтобы выделять HTML-код "в дикой природе", так что это хорошая идея, чтобы мастера сообщили вам, что неправильно, и не оставляйте его более практичный инструмент - там много сайтов, которые не являются совершенным, совместимым с HTML, но которые мы по-прежнему используем каждый день.