当前位置: 首页 > news >正文

JSP过滤器防止Xss漏洞

在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。

那就是利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。使得在业务层的处理时不用担心会有异常输入内容。

XssFilter.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片

    package filter;  
      
    import java.io.IOException;  
      
    import javax.servlet.Filter;  
    import javax.servlet.FilterChain;  
    import javax.servlet.FilterConfig;  
    import javax.servlet.ServletException;  
    import javax.servlet.ServletRequest;  
    import javax.servlet.ServletResponse;  
    import javax.servlet.http.HttpServletRequest;  
      
    public class XssFilter implements Filter {  
      
    public void init(FilterConfig config) throws ServletException {  
    }  
      
    public void doFilter(ServletRequest request, ServletResponse response,  
    FilterChain chain) throws IOException, ServletException   
    {  
    XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(  
    (HttpServletRequest) request);  
    chain.doFilter(xssRequest, response);  
    }  
      
    public void destroy() {  
    }  
    }  



XssHttpServletRequestWrapper.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片

    package filter;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletRequestWrapper;  
      
    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {  
    HttpServletRequest orgRequest = null;  
      
    public XssHttpServletRequestWrapper(HttpServletRequest request) {  
    super(request);  
    orgRequest = request;  
    }  
      
    /**
    * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
    * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
    * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
    */  
    @Override  
    public String getParameter(String name) {  
    String value = super.getParameter(xssEncode(name));  
    if (value != null) {  
    value = xssEncode(value);  
    }  
    return value;  
    }  
      
    /**
    * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
    * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
    * getHeaderNames 也可能需要覆盖
    */  
    @Override  
    public String getHeader(String name) {  
      
    String value = super.getHeader(xssEncode(name));  
    if (value != null) {  
    value = xssEncode(value);  
    }  
    return value;  
    }  
      
    /**
    * 将容易引起xss漏洞的半角字符直接替换成全角字符
    *
    * @param s
    * @return
    */  
    private static String xssEncode(String s) {  
    if (s == null || s.isEmpty()) {  
    return s;  
    }  
    StringBuilder sb = new StringBuilder(s.length() + 16);  
    for (int i = 0; i < s.length(); i++) {  
    char c = s.charAt(i);  
    switch (c) {  
    case '>':  
    sb.append('>');//全角大于号  
    break;  
    case '<':  
    sb.append('<');//全角小于号  
    break;  
    case '\'':  
    sb.append('‘');//全角单引号  
    break;  
    case '\"':  
    sb.append('“');//全角双引号  
    break;  
    case '&':  
    sb.append('&');//全角  
    break;  
    case '\\':  
    sb.append('\');//全角斜线  
    break;  
    case '#':  
    sb.append('#');//全角井号  
    break;  
    default:  
    sb.append(c);  
    break;  
    }  
    }  
    return sb.toString();  
    }  
      
    /**
    * 获取最原始的request
    *
    * @return
    */  
    public HttpServletRequest getOrgRequest() {  
    return orgRequest;  
    }  
    /**
    * 获取最原始的request的静态方法
    *
    * @return
    */  
    public static HttpServletRequest getOrgRequest(HttpServletRequest req) {  
    if(req instanceof XssHttpServletRequestWrapper){  
    return ((XssHttpServletRequestWrapper)req).getOrgRequest();  
    }  
      
    return req;  
    }  
    }  

在web.xml中添加

[html] view plaincopy在CODE上查看代码片派生到我的代码片

     <filter>  
    <filter-name>xssFilter</filter-name>  
    <filter-class>filter.XssFilter</filter-class>  
    </filter>  
    <filter-mapping>  
    <filter-name>xssFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
    </filter-mapping> 

相关文章:

  • XSS漏洞解决方案之一:过滤器
  • 五个你必须知道的javascript和web debug技术
  • 12 款最好的 Bootstrap 设计工具
  • 设置Jetty服务器的cookie为secure和httponly
  • XSS与HTTP-only Cookie 脚本获取JSESSIONID的方法
  • DNS 安全信息 (微软)
  • DNS安全 -月宫吴刚
  • ldap 身份验证的通用步骤
  • Openssl多个安全补丁简易分析危害及修复方案
  • Redhat Linux 安全设置脚本
  • nginx中shell脚本封锁采集IP地址
  • Apache和Tomcat限制文件访问或下载
  • Postgresql默认用户名与密码
  • Oracle default SID list
  • Apache服务器禁用TRACE Method防范XSS跨站攻击
  • [译]CSS 居中(Center)方法大合集
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • android 一些 utils
  •  D - 粉碎叛乱F - 其他起义
  • ES6系统学习----从Apollo Client看解构赋值
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java程序员幽默爆笑锦集
  • Joomla 2.x, 3.x useful code cheatsheet
  • mysql 5.6 原生Online DDL解析
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpringCloud集成分布式事务LCN (一)
  • spring学习第二天
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 机器学习中为什么要做归一化normalization
  • 聊聊directory traversal attack
  • 如何实现 font-size 的响应式
  • 一、python与pycharm的安装
  • puppet连载22:define用法
  • 阿里云重庆大学大数据训练营落地分享
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #Lua:Lua调用C++生成的DLL库
  • #NOIP 2014# day.2 T2 寻找道路
  • (C语言)字符分类函数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一) storm的集群安装与配置
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)Dubbo快速入门、介绍、使用
  • (转)nsfocus-绿盟科技笔试题目
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net打印*三角形
  • .net流程开发平台的一些难点(1)
  • .NET企业级应用架构设计系列之开场白
  • @Valid和@NotNull字段校验使用
  • [ solr入门 ] - 利用solrJ进行检索
  • [20190401]关于semtimedop函数调用.txt