所在的位置: html >> html发展 >> DevKit系列1可靠的HTML

DevKit系列1可靠的HTML

北京哪家医院皮肤科 http://pf.39.net/bdfyy/tslf/180306/6084106.html
0x00前言许久以前接到一个需求,实现一个HTML富文本过滤的基础库。这个需求在其它语言实现中有许多久经考验的开源库,比如NodeJS有DOMPurify,但在Go中却异常尴尬,没有一个合适的、久经考验的HTML富文本过滤库。即使运气好找到了一个,也很难保证这个库是安全可靠的。思来想去,还是决定自己做一套性能扛得住、安全可靠的Go语言实现。0x01原理咱们的目标是做一套性能扛得住、安全可靠的Go语言实现,其核心关键词是性能和安全:出于安全考虑,这里不能轻易地使用第三方的DOM解析库(毕竟也不知道靠不靠谱),最为稳妥的办法是做一个HTML的最小语义支持,不管输入如何,这个库只支持它认为正常的HTML语法。要满足性能需求,算法复杂度不宜太高,最好是线性扫描所以最终决定使用DFA(确定有限状态自动机)从0构建一个HTML解析器。提到DFA有些同学可能会一头雾水,但提到正则表达式大家可能会相对熟悉一点。一个正则表达式,可能是一个DFA,也有可能是一个NFA(非确定有限状态自动机)。比如a*ab这个正则表达式是一个NFAa+b这个正则表达式则是一个DFA很明显,上面两个正则表达式是等价的,NFA是可以和DFA互转的。实现具体的DFA之前,我们需要先把整个状态机的实现勾勒出来,避免写代码的时候一头雾水。因此,我们按照设想的“HTML的最小语义支持”,画了下面这张状态图。实际上ETAG_END、TAG_END、NORMAL是同一种状态,但为了实现方便,这里拆成了三种状态0x02实现安全标签+安全属性状态机画出来后,还需要总结出所有的安全标签+安全属性。安全标签这个概念比较好理解,类似与script这种可以造成XSS的标签,肯定不属于安全标签。类似的,onerror这类属性,肯定也不属于安全属性。最终我们梳理出了这么一份安全标签+安全属性列表(


转载请注明:http://www.aierlanlan.com/tzrz/446.html