关于富文本过滤,就是说给一段混杂了html,js,css的文本,过滤出安全的部分,因此要做html,css解析,黑白名单设计,内容过滤。概括下来,功能点如下:
- 以白名单方式过滤html属性,标签,不在白名单内的属性和标签被过滤。
- 每个属性按照规定的格式过滤,不符合格式的清除
- 解析style属性和标签内的css表达式,过滤expression()等不安全的代码,过滤url()内的外部url引用
实际上牵涉到的主要技术有词法分析、语法分析、内容过滤。
css解析器完全是用bison + flex自己写的,参考了w3c规范提供的lalr(1)文法和词法,但是这个写的比较理想化,比实际
的要简单的多。真正在开发的时候做了很多异常处理,列举了css解析的一些难题:
1. 一些不规范的css需要解析(是指每个浏览器单独提供的一些格式,例如
*color:red
_color:red
filter:alpha(opacity=4)
color:expression(/*js code*/))
media hand screen (width=400,...) {
....
}
2. 各类编码的处理,例如css中可允许部分字符采用/067/的形式或者/g的形式表示g,还有一些地方会有unicode等
3. 一些不规范的css需要跳过,不能解析出错,比方{display:;},或者{color:display:none}
4.在解析的同时需要获取数据,比如url函数内的路径
5.需要找到expression的结尾,单纯找)肯定是不合适的,因为)可能在js的函数里,对象里,字符串里
目前我采用了bison+flex,词法分析结合语法分析,上下文无关文法lalr(1) ,使用这种方式来解析和过滤,目前开发已经快完了
不仅如此,flex作词法分析有3中状态,使用2个词法分析器,一种取<style>标签的结尾,另一种分析style内的词语