06月05, 2013

基于Fl的富文本安全过滤引擎

富文本安全过滤一直是一个非常头疼的问题,它的危害和修复难度比一般的反射型XSS要难的多。

一般的富文本过滤引擎都是通过模拟浏览器对HTML的解析来实现的。基于词法分析将文本切割成HTML TOKEN,然后通过白名单进行过滤。这种系统一般都比较复杂,维护成本也比较大。同时由于该类型的系统一般都是后端开发人员开发的,对浏览器的特性了解的比较少,但这些特性可能就会引起安全问题。

之前提过利用结构化的数据来解决这个问题,后端用PHP实现也只要500行左右,具体的方案看这里

基于FL的实现

由于一直在开发和升级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);

本文链接:http://welefen.com/post/rich-content-filter-base-on-fl.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。