富文本安全过滤一直是一个非常头疼的问题,它的危害和修复难度比一般的反射型XSS要难的多。
一般的富文本过滤引擎都是通过模拟浏览器对HTML的解析来实现的。基于词法分析将文本切割成HTML TOKEN,然后通过白名单进行过滤。这种系统一般都比较复杂,维护成本也比较大。同时由于该类型的系统一般都是后端开发人员开发的,对浏览器的特性了解的比较少,但这些特性可能就会引起安全问题。
之前提过利用结构化的数据来解决这个问题,后端用PHP实现也只要500行左右,具体的方案看这里。
由于一直在开发和升级Fl,最近基于Fl实现了富文本安全过滤的功能,一天差不多就开发完了,这得益于词法分析和语法分析之前都完全写好了。 基于Fl的实现和其他的安全过滤引擎没有本质的区别,只是有如下的优势:
1、懂前端,知道一些浏览器的特性,隐性相对来说可能会小一些,并且会持续升级
2、支持CSS的安全过滤。对于保留的CSS和引用的图片可以自动将相对地址改为绝对地址。
<?php
require_once 'Fl/Fl.class.php';
Fl::loadClass('Fl_Html_Filter');
//$text为需要过滤的内容
$instance = new Fl_html_Filter($text);
//当前页面的URL,保留页面里的css才会用到
$instance->url = $url;
//保留css时,通过该方法去获取远程css的内容
$instance->getResourceContentFn = 'getResourceCallback';
//过滤选项
$options = array (
'remove_js' => true, //移除js
'remove_tag_event' => true, //去除标签的事件
'use_blank_tag_filter' => true, //标签使用白名单
'use_blank_tag_property_filter' => true, //标签属性使用白名单
'url_max_length' => 100,
'filter_tag_style_value' => true, //过滤标签的style值
'filter_a_href_value' => true, //过滤a标签的href值
'filter_img_src_value' => true, //过滤img标签的src值
'remove_css' => false, //移除css
'external_css_to_inline' => true //将外链的css变成内联,在不移除css下有效
);
$result = $instance->run ($options);
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8