有效预防xss_XSS攻击及预防

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script(php,js等)代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

攻击实例

下面为一个Input标签:

当用输入值为" οnfοcus="alert(document.cookie)  时,input标签内容变为

当input中的可以执行的js脚本被存储到数据库中。用户再次取出显示时。就会取到用户的cookie。从而得到用户名和密码。

(1)添加用户

(2)数据库中存储可执行脚本

(3)编辑用户(XSS攻击发生)

攻击危害

以上获取用户名和密码只是个简单的xss攻击,还有跟多的XSS攻击实例。例如将用户导航到其他网站,后台挂马操作等

攻击预防

原理:主要采用过滤器对请求中的特殊字符进行编码转化。从而将可以执行的script代码变为不可以执行的script脚本存储到数据库中。

示例:开发环境采用的SSH框架。所以采用过滤器,注意这里采用装饰者模式对请求request对象进行了包装。

注:由于使用了struts2.所以要自定义的装饰者对象继承StrutsRequestWrapper类。但是这样对于上传文件获得不到参数。因为上传文件请求类型为MultiPart

所以包装对象为原始的请求HttpServletRequestWrapper

具体代码:

1 public class XssFilter implementsFilter {2

3 public voiddestroy() {4

5 }6

7 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {8 XssStrutsRequestWrapper xssRequest = newXssStrutsRequestWrapper((HttpServletRequest) servletRequest);9 HttpServletResponse response =(HttpServletResponse)servletResponse;10 filterChain.doFilter(xssRequest, response);11 }12

13 public void init(FilterConfig arg0) throwsServletException {14

15 }16

17 }

1 public class XssStrutsRequestWrapper extendsHttpServletRequestWrapper{2 privateHttpServletRequest orgRequest;3

4 publicXssStrutsRequestWrapper(HttpServletRequest request) {5 super(request);6 this.orgRequest =request;7 }8 /**

9 * 获取最原始的request10 *@return

11 */

12 publicHttpServletRequest getOrgRequest() {13 returnorgRequest;14 }15 /**

16 * 获取最原始的request的静态方法17 *@return

18 */

19 public staticHttpServletRequest getOrgRequest(HttpServletRequest req) {20 if (req instanceofXssStrutsRequestWrapper) {21 return((XssStrutsRequestWrapper) req).getOrgRequest();22 }23 returnreq;24 }25 /**

26 * 覆盖getParameter方法,将参数名和参数值都做xss过滤。
27 * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
28 * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖29 */

30 @Override31 publicString getParameter(String name) {32 String value = super.getParameter(xssEncode(name));33 if (value != null) {34 value =xssEncode(value);35 }36 returnvalue;37 }38

39 /**

40 * 覆盖getHeader方法,将参数名和参数值都做xss过滤。
41 * 如果需要获得原始的值,则通过super.getHeaders(name)来获取
42 * getHeaderNames 也可能需要覆盖43 */

44 @Override45 publicString getHeader(String name) {46 String value = super.getHeader(xssEncode(name));47 if (value != null) {48 value =xssEncode(value);49 }50 returnvalue;51 }52 /**

53 * 覆盖getParamterMap方法,54 */

55 @Override56 @SuppressWarnings("unchecked")57 public MapgetParameterMap() {58 Map paramMap = super.getParameterMap();59 Set keySet =paramMap.keySet();60 for (Iterator iterator =keySet.iterator(); iterator.hasNext();) {61 String key =(String) iterator.next();62 String[] str =paramMap.get(key);63 for(int i=0; i

65 str[i] =xssEncode(str[i]);66 }67 }68 returnparamMap ;69 }70 publicString xssEncode(String source){71 if (source == null) {72 return "";73 }74 String html = "";75 StringBuffer buffer = newStringBuffer();76 for (int i = 0; i < source.length(); i++) {77 char c =source.charAt(i);78 switch(c) {79 case '

81 buffer.append("<");82 break;83 case '>':84 //buffer.append(">");

85 buffer.append(">");86 break;87 case '&':88 //buffer.append("&");

89 buffer.append("&");90 break;91 case '"':92 //buffer.append(""");

93 buffer.append(""");94 break;95 default:96 buffer.append(c);97 }98 }99 html =buffer.toString();100 returnhtml;101 }102

103 }

这里编码实现主要是xssEncode(String source)方法。XssStrutsRequestWrapper必须重写getParameterMap()方法。并调用xssEncode(String source)编码。

结果:

数据中内容将英文的“变为全角" 。从而将可以执行的js脚本并未不可执行的脚本存储在数据库中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值