Typical wp_kses $allowed

时间:2012-03-07 作者:redconservatory

我有一个自定义的post文本框,我想使用它进行清理wp_kses 在我更新帖子元之前。

我在寻找常见的$allowed 设置,但我只看到了以下示例:

$allowed = array(  
        \'a\' => array( // on allow a tags  
            \'href\' => array() // and those anchors can only have href attribute  
        )  
    );  
什么是典型的wp_kses $allowed 背景有人能举例说明他们通常过滤的内容吗?

6 个回复
最合适的回答,由SO网友:mor7ifer 整理而成

我不同意@JaredCobb发布的解决方案,wp_kses() 比他提出的方法灵活得多。它可以从标签中去除不需要的属性,而不会破坏标签本身。例如,如果用户输入<strong class=\'foo\'>, wp_kses() 将返回<strong> 如果您不允许上课strip_tags() 将删除<strong> 彻底地

@红温室:您要使用的属性如下:

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

    //links
    \'a\'     => array(
        \'href\' => array()
    )
);
这将允许不带属性的粗体和斜体,以及带有href 属性。。。没有别的了。它使用了白名单原则,@jaredcobb正确地指出,这是更好的方法。

SO网友:mikemick

我会从同样的开始$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(),
);
我会的NOT 使用PHPstrip_tags 作为替代wp_kses.

永远不要使用strip\\u标记过滤未知用户的内容

我创建了一个快速视频解释Why WordPress’ wp_kses() is better than PHP’s strip_tags() for security.

SO网友:Svetoslav Marinov

给你。这在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;
    }
}

SO网友:Jared Cobb

我只使用了wp_kses 当我特别需要允许/过滤时attributes HTML标记(例如,我希望允许它们具有<image> 标签,带有src="" 属性但Idon\'t 希望他们能够href=""style="" 或图像标签上的任何其他内容。那样的话wp_kses 很方便,因为(正如您在创建的示例中所看到的)您可以非常具体地进行筛选。我很少使用wp_kses 不过,因为我发现几个月后看代码时,下面的几个原生PHP函数就可以做到这一点,而且更容易理解。

如果你想完全删除HTML标签(除了可能允许的一些),那么我总是使用strip_tags. 您可以传入一组允许的标记(如<p> <br> <strong>) 或者任何你喜欢的无害标签。这允许用户能够对格式进行一些控制,如果这适用于您的用例的话。我喜欢strip_tags 因为它采用白名单方法来清理数据。(意思是everything 除您明确列出的内容外,其他内容将被剥离)。

如果您的目标是允许他们将任何HTML放入内容中,但您只想在他们输入文本时显示文本(如代码示例),那么请使用htmlspecialchars. 这会将HTML字符转换为其编码的对应字符,以便您可以安全地将其输出到页面。

您可能会遇到使用str_replace 它“寻找”像或之类的坏标签。我真的不推荐这种方法,因为它需要一种清理数据的黑名单方法,而且你必须不断确保你的黑名单是最新的。

我想总结一下,这取决于你的代谢箱的用途。如果你在保护用户(可能是恶意用户)的输入,我建议你strip_tags 并且只允许一些无害的标签。如果您有一个很好的商业案例来真正微观管理用户内容的标签和特定属性,use wp_kses.

SO网友:OriginalEXE

您还可以使用wp\\u kses\\u post函数,该函数用于post内容,只需要数据作为参数。

更多信息请点击此处:http://codex.wordpress.org/Function_Reference/wp_kses_post

SO网友:Pluda

@斯韦托斯拉夫·马里诺夫

我在$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,但隐藏字符仍然保留。

结束

相关推荐