作者:老葛,北京亚艾元软件有限责任公司,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_xss对filter_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'));
}