9.2.3 漏洞防范

9.2.3 漏洞防范

由于XSS漏洞在不同浏览器下有不同的利用方式,特别是业务上有需求使用富文本编辑器的时候,防御起来就更加复杂,所以在XSS防御这块应该从多个方面入手,尽量减少XSS漏洞。

1.特殊字符HTML实体转码

一般的XSS漏洞都是因为没过滤特殊字符,导致可以通过注入单双引号以及尖括号等字符利用漏洞,比如一个图片标签<img src=“$_GET['a']”/>,则可以通过输入双引号来闭合第一个单引号利用漏洞,防御这类的XSS漏洞只需要过滤掉相关的特殊字符即可,特殊字符列表如下:

➢单引号(')

➢双引号(")

➢尖括号(<>)

➢反斜杠(\)

➢冒号(:)

➢and符(&)

➢#号(#)

还有两个问题,这些字符应该怎么过滤,什么时候过滤?为保证数据原始性,最好的过滤方式是在输出和二次调用的时候进行,如HTML实体一类的转码,防止脚本注入的问题。

2.标签事件属性黑白名单

上面我们提到过滤特殊字符来防止XSS漏洞,实际上即使过滤了也同样可能会被绕过,比如利用跟宽字节注入一样的方式来吃掉反斜杠,再利用标签的事件来执行js代码,面对这样的情况,我们还得加标签事件的黑名单或者白名单,这里更推荐用白名单的方式,实现规则可以直接用正则表达式来匹配,如果匹配到的事件不在白名单列表,就直接拦截掉,而不是替换为空。