问题概述
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
------来着百度百科
注入举例:
用户在系统可以进行输入数据的地方如:用户名用户直接把名字编辑为:
<script>alert(1)</script>
那么所有展现该用户名字的页面都会出现一个提示对话框。
如何防止
首先我们要了解数据的流向:
用户界面中输入数据----经过项目的拦截器过滤器—后台业务处理通过getParameter等类似方法获取参数---保存数据库-----界面显示
第一个环节处理:
用户界面中输入在所有页面提交位置过滤把特殊字符转义。
不太现实工作量大,且用户也可以修改提交的数据完全无法控制。
第二个环节处理:
拦截器控制
首先我们想到的是定义个过滤器在web.xml中配置然后在过滤器中得到用户输入的参数,然后对其进行转义处理,然后重新设置Parameter参数。但是很快你就会发现Parameter参数是只读的不允许修改不信你自己试下。
(推荐下面的这个方法)
如果用了jfinal框架或者你的代码已经完成不想去做太大修改。
其实可以这样重写getParameter、getParameterValues、getParameterMap的方法
步骤一:
定义自己的HttpServletRequestWrapper
对用户输入的值调用自定义的check方法进行转义
Uncheck 方法对外提供,因为这种方式把用户所有的输入参数都进行了转义,但是问题来了有的地方确实不需要转义例如cms系统中有些文章内容可能就是一些html。针对这种情况可以在业务处理中对转义后的内容调用uncheck进行还原。
步骤二:
定义自己的过滤器
让自己的HttpServletRequestWrapper去获取用户的参数输入
步骤三:
配置web.xml
在web.xml中配置一个过滤器要放在前面
完成。
第三个环节处理:
业务处理
对request的getParameter、getParameterValues、getParameterMap做一次二次封装这个方法很容易实现。
如果你项目已经完成想加入安全校验这样就改动地方就太多了。
第四个环节处理:
在保存数据库时候处理例如jfinal框架可以重写model的set方法对值进行转义可以扩展一个接口 getUncheck()获取当前model不需要转义的属性名称 set时候对其进行过滤不转义。
或者重写jfinal的save update方法对用户输入值进行转义。同样扩展一个接口 getUncheck()获取当前model不需要转义的属性名称 save update时候对其进行过滤不转义。
同样这样的方式也不舍用与已经完成的项目改动地方有点多。
第五个环节进行处理:
页面展现
页面取值都是通过后台setAttribute然后前端进行取值,可以在setAttribute把数据库的值进行一次转义。
优点:改动小用户输入什么就存入什么100%还原可查(意义不大)
缺点: 一般数据保存的次数远小于展现的次数 及 读的次数 >> 写的次数,每次展现的时候都会对所有数据进行一次转义浪费服务器资源。用时间换空间不划算。