XSS 攻击的防御

  xss攻击预防,网上有很多介绍,发现很多都是只能预防GET方式请求的xss攻击,并不能预防POST方式的xss攻击。主要是由于POST方式的参数只能用流的方式读取,且只能读取一次,经过多次尝试,也只做到了能够接受GET、POST方式的参数并进行相关转义,但是最终通过方法获取的参数仍是未转义的参数。很是遗憾。目前先把综合了网上介绍的方法的相关代码在这里整理一下,有了新的突破再来更新。

参考主要网址:

http://blog.csdn.net/Lan_Xuan/article/details/73826065

http://blog.csdn.net/happylee6688/article/details/40660797

http://www.cnblogs.com/digdeep/p/4695348.html


maven依赖:

<!-- https://mvnrepository.com/artifact/antlr/antlr -->
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>
        
        <dependency>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4-runtime</artifactId>
            <version>4.1</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.0</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.servlet</groupId>
            <artifactId>jboss-servlet-api_3.1_spec</artifactId>
            <version>1.0.0.Beta1</version>
        </dependency>

web.xml

1     <filter>
2         <filter-name>XssEscape</filter-name>
3         <filter-class>com.*.webshell.XSSFilter</filter-class>
4     </filter>
5     <filter-mapping>
6         <filter-name>XssEscape</filter-name>
7         <url-pattern>/*</url-pattern>
8         <dispatcher>REQUEST</dispatcher>
9     </filter-mapping>

ThreadCache.java

 1 public class ThreadCache {
 2        // ThreadLocal里只存储了简单的String对象,也可以自己定义对象,存储更加复杂的参数
 3         private static ThreadLocal<String> threadLocal = new ThreadLocal<String>();
 4
 5         public static String getPostRequestParams(){
 6             return threadLocal.get();
 7         }
 8
 9         public static void setPostRequestParams(String postRequestParams){
10             threadLocal.set(postRequestParams);
11         }
12
13         public static void removePostRequestParams(){
14             threadLocal.remove();
15         }
16     }

XSSFilter.java

 1 import java.io.IOException;
 2
 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
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 public class XSSFilter implements Filter {
15     private static Logger log = LoggerFactory.getLogger(XSSFilter.class);
16
17     @Override
18     public void init(FilterConfig filterConfig) throws ServletException {
19     }
20
21     @Override
22     public void destroy() {
23     }
24
25     @Override
26     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
27             throws IOException, ServletException {
28            try {
29                 WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest((HttpServletRequest) request);
30
31                 if ("POST".equals(requestWrapper.getMethod().toUpperCase())) {
32                     // 获取请求参数
33                     String params = requestWrapper.getRequestParams();
34                     ThreadCache.setPostRequestParams(params);
35                     log.info("filer-post请求参数:[params={}]", params);
36                     System.out.println("filer-post请求参数:[params={}]"+ params);
37                 } else {
38                     log.info("非post请求");
39                 }
40
41                 // 这里doFilter传入我们实现的子类
42                 chain.doFilter(requestWrapper, response);
43             } catch (Exception e) {
44                 log.error(e.getMessage(), e);
45             }
46     }
47 }

WrappedHttpServletRequest.java

  1 import org.apache.commons.io.IOUtils;
  2
  3 import javax.servlet.ReadListener;
  4 import javax.servlet.ServletInputStream;
  5 import javax.servlet.http.HttpServletRequest;
  6 import javax.servlet.http.HttpServletRequestWrapper;
  7 import java.io.*;
  8
  9 public class WrappedHttpServletRequest extends HttpServletRequestWrapper {
 10
 11     private byte[] bytes;
 12     private WrappedServletInputStream wrappedServletInputStream;
 13
 14     public WrappedHttpServletRequest(HttpServletRequest request) throws IOException {
 15         super(request);
 16         // 读取输入流里的请求参数,并保存到bytes里
 17         bytes = IOUtils.toByteArray(request.getInputStream());
 18         ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
 19         this.wrappedServletInputStream = new WrappedServletInputStream(byteArrayInputStream);
 20
 21         // 很重要,把post参数重新写入请求流
 22         reWriteInputStream();
 23
 24     }
 25
 26     public String[] getParameterValues(String parameter) {
 27         String[] values = super.getParameterValues(parameter);
 28         if (values == null) {
 29             return null;
 30         }
 31         int count = values.length;
 32         String[] encodedValues = new String[count];
 33         for (int i = 0; i < count; i++) {
 34             encodedValues[i] = cleanXSS(values[i]);
 35         }
 36         return encodedValues;
 37     }
 38
 39     public String getParameter(String parameter) {
 40
 41         if ("POST".equals(super.getMethod().toUpperCase())) {
 42             String cleanXSS = cleanXSS(ThreadCache.getPostRequestParams());
 43             System.out.println("cleanXSS:" + cleanXSS);
 44             return cleanXSS;
 45         }
 46
 47         String value = super.getParameter(parameter);
 48         if (value == null) {
 49             return null;
 50         }
 51         return cleanXSS(value);
 52     }
 53
 54     public String getHeader(String name) {
 55         String value = super.getHeader(name);
 56         if (value == null)
 57             return null;
 58         return cleanXSS(value);
 59     }
 60
 61     private String cleanXSS(String value) {
 62         value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
 63         value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
 64         value = value.replaceAll("‘", "& #39;");
 65         value = value.replaceAll("eval\\((.*)\\)", "");
 66         value = value.replaceAll("[\\\"\\\‘][\\s]*javascript:(.*)[\\\"\\\‘]", "\"\"");
 67         value = value.replaceAll("script", "");
 68         return value;
 69     }
 70
 71     /**
 72      * 把参数重新写进请求里
 73      */
 74     public void reWriteInputStream() {
 75         wrappedServletInputStream.setStream(new ByteArrayInputStream(bytes != null ? bytes : new byte[0]));
 76     }
 77
 78     @Override
 79     public ServletInputStream getInputStream() throws IOException {
 80         return wrappedServletInputStream;
 81     }
 82
 83     @Override
 84     public BufferedReader getReader() throws IOException {
 85         return new BufferedReader(new InputStreamReader(wrappedServletInputStream));
 86     }
 87
 88     /**
 89      * 获取post参数,可以自己再转为相应格式
 90      */
 91     public String getRequestParams() throws IOException {
 92         return new String(bytes, this.getCharacterEncoding());
 93     }
 94
 95     private class WrappedServletInputStream extends ServletInputStream {
 96
 97         public void setStream(InputStream stream) {
 98             this.stream = stream;
 99         }
100
101         private InputStream stream;
102
103         public WrappedServletInputStream(InputStream stream) {
104             this.stream = stream;
105         }
106
107         @Override
108         public int read() throws IOException {
109             return stream.read();
110         }
111
112         @Override
113         public boolean isFinished() {
114             return true;
115         }
116
117         @Override
118         public boolean isReady() {
119             return true;
120         }
121
122         @Override
123         public void setReadListener(ReadListener readListener) {
124
125         }
126     }
127 }
时间: 2024-10-15 15:09:39

XSS 攻击的防御的相关文章

WEB安全实战(三)XSS 攻击的防御

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

XSS攻击及防御链接整理

XSS攻击及防御:http://blog.csdn.net/ghsau/article/details/17027893 Web攻防系列教程之跨站脚本攻击和防范技巧详解:http://www.rising.com.cn/newsletter/news/2012-04-25/11387.html Web安全测试之XSS:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html xss攻击入门:http://www.cnblogs

转---如何让前端更安全?——XSS攻击和防御详解

前言 平时很少关注安全这块的技术,曾经也买过一本<Web前端黑客技术揭秘>但至今还没翻过,尴尬.今天的早读文章由腾讯优测@小吉带来的分享. 正文从这开始~ 最近深入了解了一下XSS攻击.以前总浮浅的认为XSS防御仅仅只是输入过滤可能造成的XSS而已.然而这池子水深的很呐. XSS的类型 总体来说,XSS分三类,存储型XSS.反射型XSS.DOM-XSS. 存储型XSS 数据库中存有的存在XSS攻击的数据,返回给客户端.若数据未经过任何转义.被浏览器渲染.就可能导致XSS攻击: 反射型XSS 将

XSS攻击及防御

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17027893,转载请注明.       XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie.破坏页

XSS 攻击实验 &amp; 防御方案

XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演示xss攻击的实验 假设某个恶意用户在注册时输入的用户名中包含攻击代码 首先准备一个jsp页面来显示用户列表 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t

经典面试题:xss攻击和防御

XSS 分为三种:反射型,存储型和 DOM-based 如何攻击 XSS 通过修改 HTML 节点或者执行 JS 代码来攻击网站. 例如通过 URL 获取某些参数 <!-- http://www.domain.com?name=<script>alert(1)</script> --> <div>{{name}}</div> 上述 URL 输入可能会将 HTML 改为 <div><script>alert(1)</s

xss攻击与防御

除了在引号中分割单词和强制结束语句外,额外的空格没有意义.            >>>>>>java script : alert  同理 换行符/tab

防御XSS攻击的七条原则

本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS Attack><DOM Based XSS> 攻击者可以利用XSS漏洞向用户发送攻击脚本,而用户的浏览器因为没有办法知道这段脚本是不可信的,所以依然会执行它.对于浏览器而言,它认为这段脚本是来自可以信任的服务器的,所以脚本可以光明正大地访问Cookie,或者保存在浏览器里被当前网站所用的敏感

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

上文说完了CSRF攻击,本文继续研究它的兄弟XSS攻击. 什么是XSS攻击 XSS攻击的原理 XSS攻击的方法 XSS攻击防御的手段 什么是XSS攻击 XSS攻击全名(Cross-Site-Script)跨域脚本攻击,为了跟CSS(Cascading-Style-Sheet)区分开来,所以缩写是XSS. XSS攻击的原理 上一节说道的CSRF攻击是利用的是"伪请求",这一节的XSS的原理是利用脚本注入的方式. 主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植