在PHP脚本中,我接受来自textarea
的用户的输入,并希望允许一些基本标记。所以当我输出我正在使用的字符串 -
echo strip_tags($content, '<b><i><ul><ol><li>');
现在通常我会使用FILTER_SANITIZE_STRING
,但这会删除所有标签,我会使用html_entities()
,但这会阻止我正在通过显示的标签。
那么我需要剥离或编码什么呢?我该怎么做?
答案 0 :(得分:3)
我不认为您可以依赖strip_tags()
出于安全目的 - 来自http://php.net/strip_tags:
此功能不会修改任何内容 您允许的标记上的属性 使用allowable_tags,包括 样式和onmouseover属性 一个淘气的用户可能会滥用 发布将显示的文本 其他用户。
最好看一下HTML Purifier或PEAR HTML_Safe之类的内容,它应该能够完全按照您的意愿行事。
答案 1 :(得分:1)
您可能希望删除某些属性,例如style
。您可能还需要删除onMouseOver
和onClick
等事件处理程序
答案 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);