Типичные wp_kses $ разрешены


9

У меня есть пользовательское текстовое поле для записи, которое я хочу санировать, wp_ksesпрежде чем обновлять свою мета-запись.

Я искал примеры общих $allowedнастроек, но я видел только этот пример:

$allowed = array(  
        'a' => array( // on allow a tags  
            'href' => array() // and those anchors can only have href attribute  
        )  
    );  

Что такое типичная wp_kses $allowedобстановка? Может ли кто-нибудь привести пример того, что он обычно фильтрует?


Этот вопрос выходит за рамки сайта, поскольку существует более одного правильного ответа. Если вы сузите сферу охвата вопроса, представьте пример использования и попросите кого-нибудь предоставить вам вещи, которые вы должны включить, что было бы намного лучше.
mor7ifer

Я хочу иметь расширенное текстовое поле, в котором пользователь может просто ввести обычный текст, полужирный шрифт, ссылки, курсив ...
redconservatory

Ответы:


8

Я бы не согласился с решением, опубликованным @JaredCobb, wp_kses()гораздо более гибким, чем метод, который он представил. Он может удалять нежелательные атрибуты из тегов, не разрушая сами теги. Например, если пользователь вставил <strong class='foo'>, wp_kses()вернется, <strong>если вы не разрешили класс, тогда как strip_tags()удалил бы <strong>полностью.

@redconservatory: вы хотите использовать следующие атрибуты:

$args = array(
    //formatting
    'strong' => array(),
    'em'     => array(),
    'b'      => array(),
    'i'      => array(),

    //links
    'a'     => array(
        'href' => array()
    )
);

Это позволит выделять жирным шрифтом и курсивом без атрибутов, а также привязывать теги с hrefатрибутами ... и больше ничего. Он использует принцип белого списка, который, как справедливо заметил @jaredcobb, является лучшим способом.


Не можете ли вы сказать стрип-тегам, какие теги разрешены? php.net/manual/en/function.strip-tags.php
redconservatory

Хотя я все еще вижу, как wp_kses лучше, когда я вижу, как он удаляет ненужные классы ...
redconservatory

Я, вероятно, не объяснил ясно ... Но да, wp_ksesпозволяет больше контроля, чем нативные опции PHP. Я думаю, что сказал это. Я также использовал слово «атрибуты». Я говорил, что это зависит от вашего варианта использования. Кому-то, пытающемуся защитить свои данные от всех тегов, было бы лучше использовать ИМХО strip_tags, но это больше, чем я. Приветствия.
Джаред Кобб

7

Я бы начал с того же $allowedtagsмассива, который WordPress использует для своих комментариев. Вы можете найти их массив в [wordpress directory]/wp-includes/kses.phpфайле. Мне кажется, что это разумные значения по умолчанию и хорошая отправная точка. Вот их массив ...

$allowedtags = array(
    'a' => array(
        'href' => true,
        'title' => true,
    ),
    'abbr' => array(
        'title' => true,
    ),
    'acronym' => array(
        'title' => true,
    ),
    'b' => array(),
    'blockquote' => array(
        'cite' => true,
    ),
    'cite' => array(),
    'code' => array(),
    'del' => array(
        'datetime' => true,
    ),
    'em' => array(),
    'i' => array(),
    'q' => array(
        'cite' => true,
    ),
    'strike' => array(),
    'strong' => array(),
);

Я бы не использовал PHP strip_tagsв качестве замены wp_kses.

Вы никогда не должны использовать strip_tags для фильтрации содержимого неизвестного пользователя!

Я создал короткое видео, объясняющее, почему WordPress wp_kses () лучше, чем PHP strip_tags () для безопасности .


Привет как насчет & nbps
Latheesh VM Villa

2

Я использовал только wp_ksesтогда, когда мне нужно было разрешить / отфильтровать атрибуты тегов HTML (например, я хочу, чтобы им было разрешено иметь <image>тег с src=""атрибутом, но я не хочу, чтобы они могли, но href=""или style=""или что-то еще в теге image. В этом случае это wp_ksesпригодится, потому что (как вы можете видеть из созданного вами примера) вы можете фильтровать очень специфично. Я редко использовал wp_ksesхотя бы потому, что просто нашел пару нативных PHP Функции (ниже) делают свое дело и их легче понять, когда я смотрю на код несколько месяцев спустя.

Если вы хотите полностью удалить теги HTML (за исключением, может быть, разрешить несколько), я всегда использую strip_tags. Вы можете передать строку разрешенных тегов (например <p> <br> <strong>) или любые другие безопасные теги, которые вам нравятся. Это позволяет пользователю быть в состоянии иметь некоторый контроль над форматированием, если это применимо для вашего использования. Мне нравится, strip_tagsпотому что для очистки ваших данных требуется белый список . (Это означает, что все будет удалено, кроме того, что вы явно белый список).

Если ваша цель состоит в том, чтобы позволить им вставлять любой HTML-код в контент, но вы просто хотите показать их текст в том виде, в каком они были введены (например, примеры кода), используйте htmlspecialchars. Это преобразует символы HTML в их закодированные аналоги, чтобы вы могли безопасно выводить их на страницу.

Вы можете встретить код, использующий str_replaceкоторый «ищет» плохие теги, такие как или что угодно. Я действительно не рекомендую такой подход, потому что он использует черный список для очистки данных, и вы должны постоянно следить за актуальностью своего черного списка.

Полагаю, это зависит от того, для чего используются ваши метабоксы. Если вы защищаете от ввода со стороны пользователей (которые могут быть вредоносными), я бы порекомендовал strip_tagsи просто разрешил некоторые из безопасных тегов. Если у вас есть хороший бизнес дело действительно микроуровень теги и определенные атрибуты контента пользователя, use wp_kses.


Не wp_kses()делает все, что strip_tags()делает и больше? Я за простоту, но я думаю, что есть аргумент, чтобы никого не «удивлять». wp_kses()это «путь Wordpress», и поскольку мы пишем код Wordpress, есть аргумент, что это, вероятно, лучший выбор. Кроме того, если в какой-то момент в будущем мы захотим внести в белый список определенные комбинации тегов / атрибутов, использование wp_kses()с самого начала не требует рефакторинга.
Риного

2

Вот и ты. Это работает как в WordPress, так и вне WordPress.

<?php

$str = '     I am <strong>stronger</strong> and cooler every single day <aaaaa>.    ';
echo orbisius_html_util::strip_tags($str);

/**
 * Util HTML class
 * @author Svetoslav Marinov (SLAVI) | http://orbisius.com
 */
class orbisius_html_util {
    /**
     * Uses WP's wp_kses to clear some of the html tags but allow some attribs
     * usage: orbisius_html_util::strip_tags($str);
     * uses WordPress' wp_kses()
     * @param str $buffer string buffer
     * @return str cleaned up text
     */
    public static function strip_tags($buffer) {
        static $default_attribs = array(
            'id' => array(),
            'class' => array(),
            'title' => array(),
            'style' => array(),
            'data' => array(),
            'data-mce-id' => array(),
            'data-mce-style' => array(),
            'data-mce-bogus' => array(),
        );

        $allowed_tags = array(
            'div'           => $default_attribs,
            'span'          => $default_attribs,
            'p'             => $default_attribs,
            'a'             => array_merge( $default_attribs, array(
                'href' => array(),
                'target' => array('_blank', '_top'),
            ) ),
            'u'             =>  $default_attribs,
            'i'             =>  $default_attribs,
            'q'             =>  $default_attribs,
            'b'             =>  $default_attribs,
            'ul'            => $default_attribs,
            'ol'            => $default_attribs,
            'li'            => $default_attribs,
            'br'            => $default_attribs,
            'hr'            => $default_attribs,
            'strong'        => $default_attribs,
            'blockquote'    => $default_attribs,
            'del'           => $default_attribs,
            'strike'        => $default_attribs,
            'em'            => $default_attribs,
            'code'          => $default_attribs,
        );

        if (function_exists('wp_kses')) { // WP is here
            $buffer = wp_kses($buffer, $allowed_tags);
        } else {
            $tags = array();

            foreach (array_keys($allowed_tags) as $tag) {
                $tags[] = "<$tag>";
            }

            $buffer = strip_tags($buffer, join('', $tags));
        }

        $buffer = trim($buffer);

        return $buffer;
    }
}

Здравствуйте, господин Святослав, это в наши дни все еще безопасно? Я искал простой, но безопасный способ обезопасить ввод пользователя в свой бэк-офис (без Wordpress). Я просто хочу разрешить использование базового форматирования html, такого как присутствующие в вашем коде, <b>, <I>, < и>. Как вы думаете, я могу использовать это как strip_tags ($ _ POST ['myDoc']) или вы думаете, что я должен сделать что-нибудь еще, чтобы быть в безопасности? Спасибо за помощь!
Плуда

Привет, используйте мой код Он проверяет, запускается ли он в контексте WordPress, будет использовать функцию WP, в противном случае откроется php strip_tags. Также лучше использовать $ _REQUEST, а не $ _POST, потому что в какой-то момент вы можете передать данные в качестве параметра GET.
Святослав Маринов

Спасибо за ответ :-). Сейчас я борюсь с проблемой ... если я вставляю отформатированный html или, например, какой-то код из возвышенного текста 3, большая часть текста отсутствует, должен быть какой-то скрытый отформатированный код, нарушающий сценарий.
Pluda

может быть проблема с кодировкой utf8
Святослав Маринов

Может быть, я очищаю HTML, как я уже писал в ответе выше, ищу \ n, \ r и так далее, но проблема все еще есть :-(. Очистка вставленных данных может быть огромной проблемой, некоторые несколько лет назад я использовал копировать вставить в textedit, чтобы очистить скопированные строки, но я не могу ожидать, что мои пользователи будут делать то же самое
Pluda


0

@Славослав Маринов

Я добавил этот код сразу после $ buffer = trim ($ buffer);

    $string_limpa = array(
                '<div><p><\/div>' => '<br>',
                '<div><br><\/div>'=> '<br>',
                '<div align="left"><br><\/div>' => '<br>',
                '<div align="center"><br><\/div>' => '<br>',
                '<div align="right"><br><\/div>' => '<br>',
                '<div style="text-align: left;"><br><\/div>' => '<br>',
                '<div style="text-align: center;"><br><\/div>' => '<br>',
                '<div style="text-align: right;"><br><\/div>' => '<br>',
                '<div style="text-align: justify;"><br><\/div>' => '<br>',
                'class="Apple-style-span"' => '<br>',
                '<p><br></p>' => '<br>',
                '<p><b></p>' => '<br>',
                '<p><i></p>' => '<br>',
                '<p><u></p>' => '<br>',
                '\r' => '<br>',
                '\n' => '<br>',
                '\t' => ' ',
                '\0' => ' ',
                '\x0B' => '<br>',
                '<p style="text-align: center;"><br></p>' => '<br>'
            );
    return strtr($buffer, $string_limpa);

попытаться очистить HTML и избежать вставки скрытых символов, нарушающих код, но он не работает, он очищает HTML, но скрытые символы все еще остаются.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.