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

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

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

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

Можете ли вы описать успехи этих или каких-либо более простых стратегий, которые также эффективны? Какие ловушки нужно остерегаться?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
17
0
4 928
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Также обратите внимание на выглядящие корректно:

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

и

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

Спасибо Росс, это отличные примеры входных данных, которые следует отфильтровать. Но ответ, который я ищу, также будет включать методы и решения.

Barry Austin 14.10.2008 18:52

Первый пример (который является ссылкой на статью codinghorror: codinghorror.com/blog/archives/001171.html) на самом деле не актуален, поскольку «дыра» зависит от природы этого URL-адреса, а не от синтаксиса этого конкретного фрагмента HTML.

Bobby Jack 14.10.2008 19:26

Есть еще полезные правила, которые можно применить к первому, например, "разрешить тег <img> только тогда, когда атрибут src совпадает с регулярным выражением /^http://localsite.com/uploaded_images/[\w- ] * \. (png | jpg | ‌ gif) $ / i ".

Barry Austin 14.10.2008 20:21

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

http://validator.w3.org/

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

Валидация против DTD вообще не защищает от XSS.

Kornel 14.10.2008 01:40

Точно, я не думаю, что Барри имел в виду валидацию - подумайте о проверке или проверке данных, а не о проверке стандартов. Это поможет против искаженного HTML;)

Ross 14.10.2008 01:42
Ответ принят как подходящий

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

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

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

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

Оказалось, что в 2008 году было далеко не безопасно, эти эксплойты были обнаружены в 2011 году: secunia.com/advisories/43907, 2010: secunia.com/advisories/39613 Урок: обязательно обновляйте установку фильтра.

Cheekysoft 01.09.2011 17:11

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

Другие вопросы по теме