前言

 
上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响。那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全漏洞。
 
由于公司用的是 SpringMVC,因此,这次就主要基于 SpringMVC 来解决这些漏洞。当然,其实这些解决方案都是大同小异,对于什么环境来说根本无所谓。了解了原理,什么环境、什么语言都可以运用自如了。废话就不多说了,直接上解决方案。
 
 

解决方案

 
  • 方案一
 
方案一主要是利用了 SpringMVC 的特性,使用 SpringMVC 内置的方法 defaultHtmlEscape,在 web.xml 中配置上 context-param,然后在 Form 中加入 spring 的标签,具体配置如下。
 
  1. <span style="font-family:Comic Sans MS;">web.xml
  2. <context-param>
  3. <param-name>defaultHtmlEscape</param-name>
  4. <param-value>true</param-value>
  5. </context-param>
  6. Forms
  7. <spring:htmlEscape defaultHtmlEscape="true" /></span><span style="font-family:微软雅黑;">
  8. </span>

  • 方案二
 
第二种方案也是借助外力,主要是加入一个第三方的 jar 包,然后使用第三方组件给提供的 api,我们通过调用这些 api 可以避免 XSS 攻击带来的危险。具体步骤如下。
 
首先,添加第三方的组件包,commons-lang-2.5.jar,可以手动下载,也可以使用 maven 配置依赖,管理 jar,推荐使用后者。
 
然后,在后台调用这些函数,StringEscapeUtils.escapeHtml(string);StringEscapeUtils.escapeJavaScript(string);StringEscapeUtils.escapeSql(string);
 
最后,在前台的 js 调用 escape 即可。
 
 
  • 方案三
 
接下来,主要讲一下第三种方案,因为在第三种方案中,我们要自己写一个 Filter,使用 Filter 来过滤浏览器发出的请求。对每个 post 请求的参数过滤一些关键字,替换成安全的,例如:< > ' " \ / # & 。方法是实现一个自定义的 HttpServletRequestWrapper,然后在 Filter 里面调用它,替换掉 getParameter 函数即可,具体步骤如下。
 
首先,在后台添加一个 XssHttpServletRequestWrapper 类,代码如下。
 
  1. <span style="font-family:Comic Sans MS;">package com.sic.web.beans;
  2. import java.util.Enumeration;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  6. public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
  7. super(servletRequest);
  8. }
  9. public String[] getParameterValues(String parameter) {
  10. String[] values = super.getParameterValues(parameter);
  11. if (values==null)  {
  12. return null;
  13. }
  14. int count = values.length;
  15. String[] encodedValues = new String[count];
  16. for (int i = 0; i < count; i++) {
  17. encodedValues[i] = cleanXSS(values[i]);
  18. }
  19. return encodedValues;
  20. }
  21. public String getParameter(String parameter) {
  22. String value = super.getParameter(parameter);
  23. if (value == null) {
  24. return null;
  25. }
  26. return cleanXSS(value);
  27. }
  28. public String getHeader(String name) {
  29. String value = super.getHeader(name);
  30. if (value == null)
  31. return null;
  32. return cleanXSS(value);
  33. }
  34. private String cleanXSS(String value) {
  35. value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
  36. value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
  37. value = value.replaceAll("'", "& #39;");
  38. value = value.replaceAll("eval\\((.*)\\)", "");
  39. value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
  40. value = value.replaceAll("script", "");
  41. return value;
  42. }
  43. } </span>
 
然后,同样在后台添加一个过滤器 XssFilter,具体代码如下。
 
  1. <span style="font-family:Comic Sans MS;">package com.sic.web.beans;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. public class XssFilter implements Filter {
  12. FilterConfig filterConfig = null;
  13. public void init(FilterConfig filterConfig) throws ServletException {
  14. this.filterConfig = filterConfig;
  15. }
  16. public void destroy() {
  17. this.filterConfig = null;
  18. }
  19. public void doFilter(ServletRequest request, ServletResponse response,
  20. FilterChain chain) throws IOException, ServletException {
  21. chain.doFilter(new XssHttpServletRequestWrapper(
  22. (HttpServletRequest) request), response);
  23. }
  24. }</span>
 
最后,在 web.xml 里面配置一下,所有请求的 getParameter 会被替换,如果参数里面含有敏感词会被替换掉。
 
  1. <span style="font-family:Comic Sans MS;"><filter>
  2. <filter-name>XssSqlFilter</filter-name>
  3. <filter-class>com.ibm.web.beans.XssFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>XssSqlFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping></span>
到这里,就基本完成了一个 XSS 攻击防御的隔离层。每一次请求中的危险字符、敏感信息都会被过滤掉,当然,如果你需要过滤的字符有很多,你还可以在 cleanXSS 方法中补充,直到你满意为止。当然,需要注意的是,一些必要的字符不能被过滤,否则就改变了用户的真实数据。
 
 

一个实例

 
下面提供了一个登录页面的攻击实例,你可以通过下面的方式进行简单的测试,看看你的网站是否有这样的问题,当然,这只是最简单的,那些测试工具肯定要比这样的例子专业的多。很多隐藏的漏洞都能够被测试出来。
 
假设登录页面有个输入用户名和密码的输入框,可以有很多 XSS / CSRF / 注入钓鱼网站 / SQL注入等的攻击手段,例如:
 
  1. <span style="font-family:Comic Sans MS;">输入用户名 : >"'><script>alert(1779)</script>
  2. 输入用户名: usera>"'><img src="javascript:alert(23664)">
  3. 输入用户名: "'><IMG SRC="/WF_XSRF.html--end_hig--begin_highlight_tag--hlight_tag--">
  4. 输入用户名: usera'"><iframe src=http://demo.testfire.net--en--begin_highlight_tag--d_highlight_tag-->
  5. 密码随意输入。</span>

结束语

 
到这里,XSS 攻击的防御措施就写完了,而且,需要说明的一点是,这种使用 Filter 的方式,不仅仅可以防御 XSS 攻击,还可以防御 CSRF 攻击,SQL 注入等安全问题。
 
好了,就先到这吧,我也需要去充电了。明天继续修复我那未完的漏洞。Bugs!!!

XSS攻击防御篇的更多相关文章

  1. MVC WEB安全——XSS攻击防御

    XSS(跨站脚本攻击) 描述: 原理:攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到攻击用户的特殊目的. 类别: 1)被动注入(Passive Inj ...

  2. .Net Core 项目中添加统一的XSS攻击防御过滤器

    一.前言 最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击. 二.XSS简介 ...

  3. .net core xss攻击防御

    XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...

  4. 前端XSS攻击和防御

    xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会 ...

  5. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  6. XSS 攻击实验 & 防御方案

    XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演 ...

  7. 关于Web安全的那些事(XSS攻击)

    概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发 ...

  8. web 安全问题(二):XSS攻击

    上文说完了CSRF攻击,本文继续研究它的兄弟XSS攻击. 什么是XSS攻击 XSS攻击的原理 XSS攻击的方法 XSS攻击防御的手段 什么是XSS攻击 XSS攻击全名(Cross-Site-Scrip ...

  9. 155.XSS攻击原理

    XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...

随机推荐

  1. Kubernetes介绍

    Kubernetes介绍 一.Kubernetes起源 Kubernetes (K8s) 是 Google 在 2014 年发布的一个开源项目.   据说 Google 的数据中心里运行着超过 20 ...

  2. 使用AndroidStudio编译NDK的方法及错误解决方式

    參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article ...

  3. Object C学习笔记12-集合

    这里讲到的集合是指Set集合,其实Array也是一种类型的集合.在Object C中提供了两个集合类NSSet和NSMutableSet.其实NSSet和NSArray性质一样,都是用于存储对象的. ...

  4. js实现弹出框的拖拽

    //HTML部分 <div class="wrap"></div> <div class="popUpBox"> <d ...

  5. JavaSE日常笔记汇总

    1. If和switch的比较 2. continue的注意事项 在for循环中,当执行continue语句时,i++还是会执行,continue语句只代表此次循环结束,i还是会累加,并继续执行下次循 ...

  6. MySQL学习【第十篇存储引擎实际应用】

    一.将现有的myiasm引擎转化为innodb引擎 1.首先我们知道myisam有几点特别烦 a( 运用的是表级锁 b( 不支持csr(故障自动恢复) 2.mysql的5.1.177版本innodb引 ...

  7. HTML5基础知识总结(一)

    新增的标签和属性 1.结构标签 article section aside nav header footer hgroup figure address 2.媒体标签 video audio emb ...

  8. STM32的AFIO时钟什么时候需要开启

    相比于普通单片机,STM32 拥有复杂的时钟系统,相应的控制器称为 RCC(Reset Clock Controller,复位与时钟控制器).每个外设都配备了外设时钟的开关,当我们不使用某个外设时,可 ...

  9. python基础学习1-正则表达式

    #!/usr/bin/env python # -*- coding:utf-8 -*- import re print(re.findall('alex','yyyyabbblalexrrreooo ...

  10. 自动色彩均衡(ACE)快速算法

    ACE算法源自retinex算法,可以调整图像的对比度,实现人眼色彩恒常性和亮度恒常性,通过差分来计算目标点与周围像素点的相对明暗关系来校正最终像素值,有很好的增强效果.但是计算复杂度非常高,本文提出 ...