本文介绍利用正则表达式过滤JavaScript中危险脚本的四种核心规则。通过匹配script/link/style/iframe标签、on事件属性、javascript/vbscript协议链接以及expression表达式,实现对潜在恶意代码的识别。文中展示了嵌套调用实现过滤的逻辑,并讨论了简单过滤与智能判断危险脚本的区别。
JavaScript 过滤危险脚本的正则规则
以下是用于匹配危险内容的字符串规则:
1、<(script|link|style|iframe)(.|\n)*<\/\1>\s*
2、\s*on[a-z]+\s*=\s*("[^"]+"|'[^']+'|[^\s]+)\s*(?=>)
3、\s*(href|src)\s*=\s*("\s*(javascript|vbscript):[^"]+"|'\s*(javascript|vbscript):[^']+'|(javascript|vbscript):[^\s]+)\s*(?=>)
4、epression\((.|\n)*\);?
掌握了这些规则后,执行过滤操作便顺理成章。
<textarea id="bug" cols="80" rows="16"> <button id="kick">抓虫1</button> <iframe></iframe> <link href='test.css'></link> <style> a { height:expression(alert('hei')); } </style> </textarea> <button id="kick">抓虫1</button> [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
<textarea id="bug" cols="80" rows="5"> test </textarea> <button id="kick">抓虫2</button> [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
<textarea id="bug" cols="80" rows="5"> test </textarea> <button id="kick">抓虫3</button> [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
<textarea id="bug" cols="80" rows="5"> expression() test </textarea> <button id="kick">抓虫4</button> [Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
过滤函数的嵌套调用实现
通过以下方式即可调用:
k1(k2(k3(k4(str))))
简单过滤与智能判断的区别
上述方法仅执行单纯的脚本过滤。所谓过滤“危险脚本”,本意应是能够判断哪些内容属于“危险”脚本,对不危险的内容不进行过滤。然而,实现这一功能相当困难,其复杂程度相当于构建一个防火墙。