Очистка HTML с помощью функции WP_KSES() в WordPress

## WP_KSES() │ WP 1.0.0

Функция WP_KSES() очищает содержимое, оставляя только разрешенные HTML-теги, их атрибуты и значения атрибутов. Она также удаляет некоторые HTML-сущности из строки.

### Важно!

Эта функция ожидает, что строка не содержит экранирования (unslashed). Это означает, что перед использованием вам нужно удалить все обратные слеши с помощью функции wp_unslash(), так как WordPress автоматически добавляет их в запросы $_POST (это делалось PHP с версий до 5.4).

KSES — это рекурсивная аббревиатура, которая расшифровывается как "KSES Strips Evil Scripts" (KSES удаляет злобные скрипты) — подсистема в WordPress, изначально написанная Ульфом Харнхаммаром. Она предназначена для проверки и очистки текста, вводимого пользователем. С помощью KSES можно задать список допустимых тегов, стилей и протоколов, на основе которых функция удаляет всё, что не соответствует этим параметрам.

### Использует:
- wp_kses_allowed_html(): возвращает список разрешенных тегов.

### Используется в:
- wp_filter_post_kses()
- wp_kses_data()
- wp_filter_nohtml_kses()
- wp_filter_kses()
- wp_kses_post()

![Время выполнения](#) 
1 раз — 0.0003581 сек (быстро) | 50000 раз — 2.35 сек (быстро) | PHP 7.4.25, WP 6.0.1

### Нет хуков.

---

### Возврат

Строка. Очищенное содержимое, содержащее только разрешенные HTML-теги.

### Использование

```php
wp_kses( $string, $allowed_html, $allowed_protocols );
  • $string (строка) (обязательный) — содержимое, которое нужно очистить.

  • $allowed_html (массив/строка) (обязательный) — список разрешенных HTML-элементов в поданном содержимом. Если указать строковое значение, это будет означать группу предопределенных тегов:

    • post — оставить теги, valid для постов (глобальная переменная $allowedposttags)
    • strip — удалит�� все теги. Аналог функции strip_tags().
    • entities — HTML-сущности, такие как   (глобальная переменная $allowedentitynames)
    • user_description, pre_user_description — то же самое, что и по умолчанию, но с разрешенным атрибутом rel для ссылок <a rel="">.
    • default или любая строка — список валидных тегов. Используется для очищения текста комментариев: глобальная переменная $allowedtags.

Примечание: Параметр может принимать строку, хотя в документации функции указано только массив. Подтверждение: wp_kses() → wp_kses_split() → _wp_kses_split_callback() → wp_kses_split2() → wp_kses_allowed_html().

  • $allowed_protocols (массив) — список разрешенных протоколов для ссылок в содержимом. По умолчанию разрешены следующие протоколы:

    • http
    • https
    • ftp
    • ftps
    • mailto
    • news
    • irc
    • gopher
    • nntp
    • feed
    • telnet
    • mms
    • rtsp
    • svn
    • tel
    • fax
    • xmpp
    • webcal
    • urn

    Это основные протоколы. Лучше запретить протокол javascript для сомнительных пользователей.

По умолчанию: array().

Примеры

1 Очистка содержимого с помощью WP KSES

Оставим только теги 'a' (с атрибутами 'href' и 'title'), 'br', 'em' и 'strong'. Все остальные будут удалены:

$string = wp_unslash( $_POST['text'] );

// Разрешенные теги
$allowed_html = array(
    'a' => array(
        'href'  => true,
        'title' => true,
    ),
    'br'     => array(),
    'em'     => array(),
    'strong' => array()
);

$text = wp_kses( $string, $allowed_html );

echo $text;

2 Оставим теги, которые допустимы при комментировании

$text = "
1111
222"; $text = wp_kses( $text, 'default' ); echo $text; // Вывод: // 1111222

3 Какие теги разрешены в глобальной переменной $ALLOWEDTAGS

Тег и разрешенные для него атрибуты:

  • a:{href,title}
  • abbr:{title}
  • acronym:{title}
  • b
  • blockquote:{cite}
  • cite
  • code
  • del:{datetime}
  • em
  • i
  • q:{cite}
  • s
  • strike
  • strong

Примечания

  • См. wp_kses_post() для фильтрации содержимого поста и полей.
  • См. wp_allowed_protocols() для получения списка разрешенных протоколов по умолчанию в URL ссылок.

Журнал изменений

С версии 1.0.0 - введено.


Код WP KSES

function wp_kses( $content, $allowed_html, $allowed_protocols = array() ) {
    if ( empty( $allowed_protocols ) ) {
        $allowed_protocols = wp_allowed_protocols();
    }

    $content = wp_kses_no_null( $content, array( 'slash_zero' => 'keep' ) );
    $content = wp_kses_normalize_entities( $content );
    $content = wp_kses_hook( $content, $allowed_html, $allowed_protocols );

    return wp_kses_split( $content, $allowed_html, $allowed_protocols );
}

Связанные функции

KSES (Очистка HTML)

  • allowed_tags()
  • wp_filter_kses()
  • wp_filter_nohtml_kses()
  • wp_kses_allowed_html()
  • wp_kses_array_lc()
  • wp_kses_data()
  • wp_kses_hair()
  • wp_kses_post()
  • wp_kses_uri_attributes()
  • wp_kses_version()

Очистка и экранирование

  • esc_attr()
  • esc_html()
  • esc_js()
  • esc_textarea()
  • esc_url()
  • esc_url_raw()
  • sanitize_email()
  • sanitize_file_name()
  • sanitize_html_class()
  • sanitize_option()
  • sanitize_post_field()
  • sanitize_text_field()
  • sanitize_textarea_field()
  • sanitize_title()
  • sanitize_title_with_dashes()
  • tag_escape()
  • validate_file()
  • wp_check_invalid_utf8()
  • wp_filter_post_kses()
  • wp_strip_all_tags()

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *