Функция wp_kses()
в WordPress предназначена для фильтрации HTML-контента, оставляя только разрешенные HTML-теги и атрибуты. Она помогает защитить сайт от потенциальных XSS-атак, удаляя любые элементы HTML, не включенные в список разрешенных.
string wp_kses( string $content, array|string $allowed_html, array $allowed_protocols = array() );
Параметры
- $content (string, обязательный): Текстовое содержимое, которое необходимо отфильтровать.
- $allowed_html (array|string, обязательный): Массив разрешенных HTML-элементов и атрибутов или строка, задающая предопределенный контекст, например
'post'
,'default'
,'strip'
и т.д. - $allowed_protocols (array, необязательный): Массив разрешенных URL-протоколов. Если не указано, используются протоколы по умолчанию (например,
http
,https
,mailto
).
Возврат
Функция возвращает отфильтрированную строку с содержимым, которое включает только разрешенные HTML-теги и атрибуты.
Поддерживаемые Протоколы по Умолчанию
Функция разрешает следующие протоколы для ссылок: http
, https
, ftp
, mailto
, news
, tel
, xmpp
, webcal
и другие, за исключением javascript
, который считается небезопасным.
Пример 1: Очистка текста с определенным набором HTML-тегов
Предположим, у вас есть HTML-контент с различными элементами, но вам нужно оставить только <a>
, <strong>
и <em>
.
$content = '<a href="https://example.com" title="Example Site">Перейти на сайт</a> <strong>Это важно</strong> <em>и подчеркнуто</em> <script>alert("Опасный код");</script>';
$allowed_html = array(
'a' => array(
'href' => true,
'title' => true,
),
'strong' => array(),
'em' => array()
);
$filtered_content = wp_kses($content, $allowed_html);
echo $filtered_content;
// Результат: <a href="https://example.com" title="Example Site">Перейти на сайт</a> <strong>Это важно</strong> <em>и подчеркнуто</em>
Здесь <script>
и его содержимое были удалены, оставив только разрешенные теги и атрибуты.
Пример 2: Использование предустановленного контекста 'default'
Контекст 'default'
позволяет оставлять набор тегов, безопасных для комментариев.
$content = '<div>Контейнер</div><strong>Текст</strong>';
$filtered_content = wp_kses($content, 'default');
echo $filtered_content;
// Результат: Контейнер<strong>Текст</strong>
В данном случае тег <div>
был удален, так как он не включен в разрешенный контекст 'default'
.
Пример 3: Регистрация собственного контекста с разрешенными тегами
Вы можете добавить свой собственный контекст и указать набор разрешенных тегов для этого контекста. Для этого добавьте фильтр wp_kses_allowed_html
.
add_filter('wp_kses_allowed_html', function($tags, $context) {
if ($context === 'custom_context') {
return array(
'u' => array(), // разрешаем тег <u>
'strong' => array() // разрешаем тег <strong>
);
}
return $tags;
}, 10, 2);
$content = '<u>Подчеркнутый текст</u> и <strong>жирный текст</strong> <em>и курсив</em>';
$filtered_content = wp_kses($content, 'custom_context');
echo $filtered_content;
// Результат: <u>Подчеркнутый текст</u> и <strong>жирный текст</strong>
В этом примере мы создали контекст custom_context
, разрешив только теги <u>
и <strong>
. Все остальные теги, включая <em>
, были удалены.
Заключение
Функция wp_kses()
является важным инструментом для фильтрации HTML-контента, предоставляя гибкость и контроль над допустимыми элементами. Она защищает сайт от внедрения вредоносного кода, сохраняя при этом полезные HTML-структуры.