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

1776次阅读  |  发布于5年以前

富文本安全过滤一直是一个非常头疼的问题,它的危害和修复难度比一般的反射型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);

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8