Функция 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-структуры.