You are here

23 使用filter_xss()

admin 的头像
Submitted by admin on 星期五, 2015-09-18 09:36

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

函数filter_xss()的签名如下所示:

filter_xss($string, $allowed_tags = array('a', 'em', 'strong', 'cite', 'code',

'ul', 'ol', 'li', 'dl', 'dt', 'dd'))

filter_xss($string, $allowed_tags = array('a', 'em', 'strong', 'cite', 'blockquote', 'code', 'ul', 'ol', 'li', 'dl', 'dt', 'dd'))

从这个函数的名字,我们就可以看出,它是专门用来防止XSS攻击的。在Drupal7中,这个函数是放在common.inc文件中的,在以前的Drupal6中则放在了filter.module文件中。

 

这个函数做四件事情:

1.删除可能欺骗浏览器的字符、结构体。

 

2. 确保所有HTML实体格式良好。

 

3. 确保HTML标签和标签属性的形式良好

 

4. 它确保没有HTML标签包含带有未允许协议的URL

 

5. 它确保所有的HTML标签,都不包含不允许的协议。比如javascript:。而允许的协议有'ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal'。你可以通过在settings.php中设置filter_allowed_protocols变量来修改这一列表。filter_xss()过滤不允许协议,是通过filter_xss_bad_protocol drupal_strip_dangerous_protocols函数实现的。

 


下面filter_xss()例子很多,modules/field/modules/list/list.module,文件中的list_field_formatter_view函数中,为了避免潜在的安全隐患,使用了field_filter_xss,代码如下

 

case 'list_key':

foreach ($items as $delta => $item) {

$element[$delta] = array('#markup' => field_filter_xss($item['value']));

}

break;

 

    这里的field_filter_xssfilter_xss作了简单的封装,设置了自己允许的标签:

function field_filter_xss($string) {

  return filter_xss($string, _field_filter_xss_allowed_tags());

}

 

对于与后台管理界面相关的内容过滤Drupal提供了函数filter_xss_admin()。它对filter_xss()做了简单的封装,只不过使用的可用标签更多一点,除了<script> 和 <style>标签以外,它包含了所有的可用标签。这是因为管理员比普通用户更加可信一点。使用它的一个例子是在主题中展示站点的宗旨(mission):

if (drupal_is_front_page()) {

$mission = filter_xss_admin(theme_get_setting('mission'));

}


Drupal版本: