Типичные 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обстановка? Может ли кто-нибудь привести пример того, что он обычно фильтрует?

redconservatory
источник
Этот вопрос выходит за рамки сайта, поскольку существует более одного правильного ответа. Если вы сузите сферу охвата вопроса, представьте пример использования и попросите кого-нибудь предоставить вам вещи, которые вы должны включить, что было бы намного лучше.
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, является лучшим способом.

mor7ifer
источник
Не можете ли вы сказать стрип-тегам, какие теги разрешены? 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 () для безопасности .

mikemick
источник
Привет как насчет & 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
1

Вы также можете использовать функцию wp_kses_post, которая используется для содержимого публикации и требует только данные в качестве параметра.

Более подробная информация здесь: http://codex.wordpress.org/Function_Reference/wp_kses_post

OriginalEXE
источник
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, но скрытые символы все еще остаются.

Pluda
источник