典型的wp_kses $ allow


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 2012年

我想要一个富文本框,用户可以在其中输入常规文本,粗体,链接,斜体...
redconservatory 2012年

Answers:


8

我不同意@JaredCobb发布的解决方案,wp_kses()它比他介绍的方法灵活得多。它可以从标签中删除不需要的属性,而不会破坏标签本身。例如,如果用户输入<strong class='foo'>,如果您不允许使用class,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 2012年

我可能没有清楚解释...但是,是的,wp_kses比本地PHP选项允许更多的控制。我想我是这么说的。我也使用“属性”一词。我是说这取决于您的用例。使用strip_tags恕我直言,尝试保护所有标签中的数据的人会更好,但是我比其他任何人都更喜欢我。干杯。
贾里德·科布

7

我将从$allowedtagsWordPress用于评论的数组开始。您可以在[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=""或图片标签上的其他内容。在这种情况下,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()从一开始就不需要进行重构。
rinogo

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>,< u>。您认为我可以将其用作strip_tags($ _ POST ['myDoc'])还是为了安全起见我应该做其他事情吗?感谢帮助!
Pluda

嗨,使用我的代码。它检查它是否在WordPress上下文中运行,将使用WP函数,否则将回退到php strip_tags。另外,最好使用$ _REQUEST而不是$ _POST,因为在某些时候,您可以将数据作为GET参数传递。
Svetoslav Marinov

谢谢您的回复 :-)。我现在正在为一个问题而苦苦挣扎...如果我粘贴格式化的html或每个示例(例如,崇高文本)中的某些代码3大部分文本丢失,那么必须有一些隐藏的格式化代码破坏了脚本。
Pluda

可能是utf8编码问题
Svetoslav Marinov

可能是,我正在清理上面回答中发布的html,搜索\ n,\ r等,但问题仍然存在:-(。清理粘贴的数据可能是个大问题,有些多年前,我使用复制粘贴对textedit进行了清理,以清除复制的字符串,但我不能指望我的用户会这样做
。– Pluda


0

@Svetoslav Marinov

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.