WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_kses() WP 1.0.1

Чистит строку, оставляя в ней только указанные HTML теги, их атрибуты и значения атрибутов.

Также функция убирает некоторые HTML сущности из строки.

Ожидает неэкранированную строку! Это значит, что перед использование нужно удалить все экранные слэши (см. wp_unslash()), которые WP автоматически добавляет для любого $_POST запроса, так как это делал PHP (PHP's magic quotes) до версии 5.4.

KSES (рекурсивный акроним от KSES Strips Evil Scripts) — подсистема в WordPress (изначально написанная Ulf Harnhammar), предназначенная для проверки и очистки текста, введённого пользователем. Позволяет задать список допустимых тэгов, стилей и протоколов, и на основе этих параметров убрать из текста пользователя всё, что им не соответствует.

Работает на основе: wp_kses_allowed_html()
✈ 1 раз = 0.000364с = быстро | 50000 раз = 2.26с = быстро | PHP 7.1.1, WP 4.7.2

Хуков нет.

Возвращает

Очищенную строку.

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

wp_kses( $string, $allowed_html, $allowed_protocols );
$string(строка) (обязательный)
Контент, который нужно очистить.
$allowed_html(массив/строка) (обязательный)

Список допустимых HTML элементов в переданном контенте. Если указать строковое значение, то оно будет означать группу предустановленных тегов:

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

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

$allowed_protocols(массив)

Протоколы, ссылки с которыми будут допущены в контенте. По умолчанию разрешены следующие протоколы, см. wp_allowed_protocols():

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

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

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

Примеры

#1. Очистим контент, используя KSES WP

Оставим в нем только теги: '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 = "<div>1111</div><strong>222</strong>";
$text = wp_kses( $text, 'default' );
echo $text;

// выведет
// 1111<strong>222</strong>

#3. Какие теги находятся в глобальной $allowedtags

Array(
	[a] => Array(
			[href] => 1
			[title] => 1
		)

	[abbr] => Array(
			[title] => 1
		)

	[acronym] => Array(
			[title] => 1
		)

	[b] => Array()

	[blockquote] => Array(
			[cite] => 1
		)

	[cite] => Array()

	[code] => Array()

	[del] => Array(
			[datetime] => 1
		)

	[em] => Array()

	[i] => Array()

	[q] => Array(
			[cite] => 1
		)

	[s] => Array()

	[strike] => Array()

	[strong] => Array()
)

Код wp kses: wp-includes/kses.php WP 5.2.1

<?php
function wp_kses( $string, $allowed_html, $allowed_protocols = array() ) {
	if ( empty( $allowed_protocols ) ) {
		$allowed_protocols = wp_allowed_protocols();
	}
	$string = wp_kses_no_null( $string, array( 'slash_zero' => 'keep' ) );
	$string = wp_kses_normalize_entities( $string );
	$string = wp_kses_hook( $string, $allowed_html, $allowed_protocols );
	return wp_kses_split( $string, $allowed_html, $allowed_protocols );
}

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

Из метки: kses (очистка html)

Еще из раздела: Очистка данных

7 комментов
  • campusboy3317 cайт: www.youtube.com/c/wpplus

    Классная функция smile Вопросик один, что делает в 1 примере функция array_map()? Без неё там никак?

    Ответить3.3 года назад #
    • Kama7453

      Хороший вопросик. Убрал эту строку из примера и добавил wp_unslash(), а то было немного не логично...

      Ответить3.3 года назад #
  • campusboy3317 cайт: www.youtube.com/c/wpplus
    $text = wp_kses( $text, 'post' );

    Не вырезает html-комментарии, не вырезает атрибут onclick у ссылок (по сути можно XXS атаку устроить, так?). Вообще не понял, что ж оно тогда вырезает laugh И почему-то var_dump($allowedposttags) не до конца показывает содержимое переменной, через определенный промежуток появляются троеточие и хватит smile хотел изучить, что ж внутри.

    Ответить2.8 года назад #
    • campusboy3317 cайт: www.youtube.com/c/wpplus

      И тогда зреет вопрос, как wp_insert_post очищает данные? Вроде там всякие очистки от мерзости идут, а по итогу js скрипты попадать могут. Пока не разобрался с этим делом.

      Ответить2.8 года назад #
      • Kama7453

        Куда в контент? Не должно такого быть...

        Что-то у тебя не то. Щас попробовал запустить такой код под администратором:

        echo esc_html( wp_kses( '<a href="#" onclick="alert(\'aaaaaa\');">link</a>', 'post' ) );
        
        // получил: <a href="#">link</a>
        Ответить2.8 года назад #
        • campusboy3317 cайт: www.youtube.com/c/wpplus

          Код:

           // Создаем массив
          $post_data = array(
             'post_title'    => $wp_post_data->title,
             'post_excerpt'  => removeHtmlComments( $wp_post_data->short_story ),
             'post_content'  => removeHtmlComments( $wp_post_data->full_story ),
             'post_status'   => $approve,
             'post_author'   => get_current_user_id(),
             'tags_input'   => $wp_post_data->tags,
             'post_category' => array( convert_category_dle_to_wp( $wp_post_data->category ) )
            );
          
          // Вставляем данные в БД
          $post_id = wp_insert_post( wp_unslash($post_data) );

          removeHtmlComments - функция из 1 регулярки, удаляю html комменты, ибо сами они не вырезаются. wp_kses тоже не помогает (у него не плохо вообще вырезать теги получается под ноль).

          А ещё, Тимур, может подскажешь куда копать. Все записи создаются с кириллистическим slug. Почему не отрабатывает cry-to-lat? При создании с админки все термы и посты создаются с латинским slug. Приходится отключать плагин и снова включать, он тогда пробегается по всем записям и конвертирует им slug. Но не трогает термы. Ума не хватает разобраться.

          P.S.: Надоело искать фильтры и хуки, как, где и что. Просто скопировал из плагина функцию транслитерации, почистил от ненужного и использую у себя в скрипте.

          Ответить2.8 года назад #
          • Kama7453

            На рабочем коде помог бы, а так ковыряться, время нет, сорри. Вчера смотрел, вроде должен срабатывать хук sanitize_title. Может конфликт какой...

            Ответить2.8 года назад #
Здравствуйте, !     Войти . Зарегистрироваться