Экранирование и фильтрация HTML в приложениях на PHP
Основные методы обработки HTML в PHP
Обработка HTML в PHP необходима для безопасного отображения пользовательского ввода, предотвращения XSS-атак и корректной работы с разметкой. В зависимости от задачи применяются разные подходы: от простого экранирования до полного парсинга и модификации.
Как экранировать HTML для безопасного вывода?
Основной и самый надёжный способ - функция htmlspecialchars(). Она преобразует специальные символы (<, >, &, ", ') в HTML-сущности, предотвращая интерпретацию как тегов.
$input = '<script>alert("XSS")</script>';
$safe = htmlspecialchars($input, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
echo $safe;Php обработка html (обработка html в php)
<script>alert("XSS")</script>Параметр ENT_QUOTES экранирует и одинарные кавычки, ENT_SUBSTITUTE заменяет некорректные символы. Кодировка UTF-8 обязательна для корректной работы с многобайтовыми строками.
Возможные проблемы и решения:
- Двойное экранирование: если строка уже содержит HTML-сущности, повторный вызов
htmlspecialcharsпревратит их в текст. Решение - экранировать только один раз перед выводом. - Пропуск символов: без указания
ENT_SUBSTITUTEневалидные UTF-8 последовательности могут привести к пустой строке. Всегда используйте эту опцию. - Не экранирует JavaScript-контекст: для данных, вставляемых в JS, требуется дополнительная обработка (например,
json_encode).
Как удалить все HTML-теги из строки?
Функция strip_tags() удаляет теги, оставляя только текст. Полезна для сохранения «чистого» текста.
$dirty = '<p>Привет, <b>мир</b>!</p>';
$clean = strip_tags($dirty);
echo $clean;Привет, мир!
Можно разрешить отдельные теги вторым аргументом.
$clean = strip_tags($dirty, '<b><i>'); // разрешены только <b> и <i>Проблемы и решения:
- Удаление не всех скриптов: если в строке есть
<script>с атрибутами событий (onclick), они не удаляются. Решение - комбинировать сhtmlspecialcharsили использовать HTML Purifier. - Некорректная обработка вложенных тегов:
strip_tagsне парсит структуру, могут остаться куски. Для сложных случаев лучше DOMDocument.
Как разрешить только безопасные HTML-теги и атрибуты?
Библиотека HTML Purifier выполняет глубокую фильтрацию, удаляя опасные элементы и сохраняя разрешённые.
require_once 'HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.Allowed', 'p,b,a[href]');
$purifier = new HTMLPurifier($config);
$clean = $purifier->purify($dirty);Проблемы и решения:
- Производительность: HTML Purifier медленный, подходит для фильтрации при сохранении, а не при каждом выводе. Решение - кэшировать результат.
- Сложность конфигурации: требуется понимание белых списков. Рекомендуется использовать готовые профили (например, TinyMCE).
Как извлечь или изменить элементы HTML?
DOMDocument позволяет парсить HTML как дерево и манипулировать узлами. Пример: заменить все ссылки на текст.
$html = '<a href="https://example.com">Ссылка</a>';
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
$text = $dom->createTextNode($link->textContent);
$link->parentNode->replaceChild($text, $link);
}
echo $dom->saveHTML();Ссылка
Проблемы и решения:
- Невалидный HTML: DOMDocument может выдавать предупреждения. Решение - использовать
libxml_use_internal_errors(true). - Добавление DOCTYPE и <html>: флаги
LIBXML_HTML_NOIMPLIEDиLIBXML_HTML_NODEFDTDпредотвращают это.
Как санитизировать строку от тегов устаревшим способом?
Ранее часто использовался filter_var($str, FILTER_SANITIZE_STRING), но в PHP 8.1 он объявлен устаревшим. Он удалял теги и частично экранировал, но ненадёжен.
$old = filter_var($input, FILTER_SANITIZE_STRING);Проблемы и решения:
- Устарел: начиная с PHP 8.1 вызов вызывает deprecation warning. Решение - заменить на
htmlspecialchars(strip_tags($str)). - Небезопасен: не экранирует спецсимволы, оставляя XSS-уязвимости.
Как безопасно передать строку из PHP в JavaScript?
Для вставки данных в JavaScript-код используется json_encode(), который экранирует строки в соответствии с JSON.
$phpString = "О'Коннор <script>";
$jsString = json_encode($phpString, JSON_HEX_TAG | JSON_HEX_APOS);
echo "var name = $jsString;";var name = "О'КоннорОбработка HTML в PHP - comments
EnPhp обработка html (php)