做富文本过滤面临的一些问题

来源:互联网 发布:mysql字符串转换成日期 编辑:程序博客网 时间:2024/05/22 01:35

关于富文本过滤,就是说给一段混杂了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内的词语
原创粉丝点击