剥离不需要的标签后,我还应该对文本输入做些什么?

时间:2009-06-09 12:53:58

标签: php xhtml string filter tags

在PHP脚本中,我接受来自textarea的用户的输入,并希望允许一些基本标记。所以当我输出我正在使用的字符串 -

echo strip_tags($content, '<b><i><ul><ol><li>');

现在通常我会使用FILTER_SANITIZE_STRING,但这会删除所有标签,我会使用html_entities(),但这会阻止我正在通过显示的标签。

那么我需要剥离或编码什么呢?我该怎么做?

6 个答案:

答案 0 :(得分:3)

我不认为您可以依赖strip_tags()出于安全目的 - 来自http://php.net/strip_tags

  

此功能不会修改任何内容   您允许的标记上的属性   使用allowable_tags,包括   样式和onmouseover属性   一个淘气的用户可能会滥用   发布将显示的文本   其他用户。

最好看一下HTML PurifierPEAR HTML_Safe之类的内容,它应该能够完全按照您的意愿行事。

答案 1 :(得分:1)

您可能希望删除某些属性,例如style。您可能还需要删除onMouseOveronClick等事件处理程序

答案 2 :(得分:1)

我过去曾使用Cal Henderson的lib_filter取得了成功,这是一个非常好的轻量级PHP4 / 5库,可以根据输入过滤标签和属性。您可以通过'allowed'成员变量指定允许的标签/属性,例如以下代码清理了来自YouTube / Vimeo / Flickr等网站的嵌入代码,但删除了所有其他内容:

        $lib_filter = new lib_filter();
        $lib_filter->allowed = array(
            'object' => array('width', 'height'),
            'param' => array('name', 'value'),
            'embed' => array('src', 'type', 'allowscriptaccess', 'allowfullscreen', 'width', 'height')
        );
        $video = $lib_filter->go($input);

答案 3 :(得分:1)

根据XSS cheat sheet中提到的规则检查您的输入。另外,从安全角度来看,最好让自己熟悉OWASP Guide to Building Secure Web Applications and Web Services

答案 4 :(得分:0)

你可以用这个

echo filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW)

非常好的教程:

http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html#12

答案 5 :(得分:0)

这个怎么样

function stripSingleTags($tags, $string)
{
    foreach( $tags as $tag )
    {
        $string = preg_replace('#</?'.$tag.'[^>]*>#is', '', $string);
    }
    return $string;
}

/*** example usage ***/
$string = '<p>stuff</p><span>more <span class="foo">and even>< more</span> stuff here</span>';

$tags = array('h1', 'span');

echo stripSingleTags($tags, $string);

来源:http://www.phpro.org/examples/Strip-Single-Tag.html