背景
Web开发,表单提交,不可避免的需要接收用户的输入,用户可能会输入一些js脚本导致XSS攻击等安全问题,那怎么解决呢?
方案1:黑名单法
在过滤器中拦截常用的危险字符,比如SCRIPT、ALERT等,如果有这些字符就进行过滤或者返回提示非法操作。
存在问题:WEB攻击漏洞多种多样,可能用户用的是img的属性,或者其他你完全没有考虑到的标签和格式,比如
<p onclick=alert(1)>
那么你就要拦截onclick,但是用户可能会换成
<p onmouseover=alert(1)>
那么你又要去拦截onmouseover,用户可能又会换其它的触发方式,所以这种方法不可取,那有人可能会说,直接拦截<,>就可以了吧,是可以,但是我们富文本肯定会带有一些html标签的,比如
<p>
<span>
<pre>
等等,这些是需要放行的,所以直接一棒子打死也不可以。
方案2:黑名单+白名单法
我们先直接用黑名单一棒子打死拦截script,alert,<,>,’,”等字符,这样,所有有js可能漏洞的内容都将报错,然后我们再用白名单放行富文本中需要可以提交的内容,比如
<span>|</span>|<p>|</p>|<br/>|<strong>|</strong>|<em>|</em>|<li>|</li>|<ol>|</ol>
上面这些标签,我们的富文本不仅仅上面那些标签,还有颜色背景颜色等相关属性,那么我们可以再加一些放行的规则,比如
style="(.*?)"
这样后续如果有新的要放行的属性,如果经过判断该属性不涉及安全,加上即可。
伪代码如下
String value = "<p style=\"\" onclick=alert>";
String attribute = "style=\"(.*?)\"|href=\"(.*?)\"";
String label = "<span>|</span>|<p>|</p>|<br/>|<strong>|</strong>|<em>|</em>|<li>|</li>|<ol>|</ol>|<a>|</a>";
//1、判断该属性是否是富文本
if(是富文本){
//2、去掉白名单属性
value = value.replaceAll(attribute,"");
//3、去除空格
value = value.replaceAll(" ","");
//4、去除标签
value = value.replaceAll(label,"");
}
//5、检查黑名单
if(check(value)){
return "有特殊字符,非法操作";
}