前言

 
上篇文章中提到了 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. C# lambda表达式参数的正确使用姿势

    C#的lambda表达式的好用就不多说了,中午吃饭的时候突然想到一个以前(有年头了,难道屌丝上岁数了就回忆这个么...)和同事争执的坑.. 列个demo吧.. 先是一个类,这个类的对象就是为了吃堆内存 ...

  2. vue watch关于对象内的属性监听

    vue可以通过watch监听data内数据的变化.通常写法是: data: { a: 100 }, watch: { a(newval, oldVal) { // 做点什么... console.lo ...

  3. jQuery----操作类样式(依托开关灯案例)

    在网页开发中,元素的样式可以在style标签中定义,但是有很多案例需要添加类样式或者删除类样式,可以获取元素调用css()方法改变元素样式,但是这种方法很繁杂,本文利用开关灯案例,小结使用jquery ...

  4. ubuntu 装 mysql

    sudo apt-get install mysql-server mysql-client

  5. @ModelAttribute三个作用:

    @ModelAttribute具有如下三个作用: ①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时 ...

  6. WPF中的动画——(一)基本概念

    WPF的一个特点就是支持动画,我们可以非常容易的实现漂亮大方的界面.首先,我们来复习一下动画的基本概念.计算机中的动画一般是定格动画,也称之为逐帧动画,它通过每帧不同的图像连续播放,从而欺骗眼和脑产生 ...

  7. bzoj1294 [SCOI2009]围豆豆

    Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...

  8. jQuery学习- 内容选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 9.13 开课第十天(JS脚本语音:语句:循环)

    循环:循环操作某一个功能(执行某段代码) 四要素:  循环初始值    循环条件   状态改变    循环体    for   穷举    迭代    while(true)  break //先执行 ...

  10. 23-[模块]-logging

    1.日志级别 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志 ...