热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Java使用过滤器防止SQL注入XSS脚本注入的实现

这篇文章主要介绍了Java使用过滤器防止SQL注入XSS脚本注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前几天有个客户在系统上写了一段html语句,打开页面就显示一张炒鸡大的图片,影响美观。后来仔细想想,幸亏注入的仅仅是html语句,知道严重性后,马上开始一番系统安全配置。

一. 定义过滤器

package com.cn.unit.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;

import org.apache.commons.lang.StringUtils;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

/**
 * 过滤器
 * Created by adonis on 2020/12/12
 */
public class SafeFilter implements Filter{
 
 // 配置信息对象
 public FilterConfig filterConfig;
 
 /**
 * 初始化
 * 与我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 
 * Web应用程序启动时,Web服务器将创建Filter的实例对象,并调用其init方法,读取web.xml配置,
 * 完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作。
 * Filter对象只会创建一次,init方法也只会执行一次。
 * 开发人员通过init方法的参数,可获得代表当前Filter配置信息的FilterConfig对象。
 */
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
   filterCOnfig= config;
 }
 
 /**
   * 拦截请求
   * 这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。
   * FilterChain参数用于访问后续过滤器。
   */
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String enctype = httpRequest.getContentType();
    if(StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data")){
     // 上传文件
     CommonsMultipartResolver commOnsMultipartResolver= new CommonsMultipartResolver(
     httpRequest.getSession().getServletContext());
   MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(httpRequest);
   XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(multipartRequest);
   chain.doFilter(xssRequest, response);
    }else{
     // 普通表单和Ajax
     XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
     chain.doFilter(xssRequest, response);
    }
  }
  
  /**
   * 销毁
   * Filter对象创建后会驻留在内存,当Web应用移除或服务器停止时才销毁。在Web容器卸载Filter对象之前被调用。
   * 该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
   */
  @Override
  public void destroy() {
   this.filterCOnfig= null;
 }
 
}

二. 过滤包装器,实现参数值过滤

package com.cn.unit.filter;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 用户请求包装类
 * Created by adonis on 2020/12/12
 */
public class SafeHttpServletRequestWrapper extends HttpServletRequestWrapper{

  public SafeHttpServletRequestWrapper(HttpServletRequest request) { 
    super(request);
  }
  
  @Override 
  public String getParameter(String name) { 
    String value = super.getParameter(name); 
    if (value != null) { 
      value = xssEncode(value); 
    } 
    return value; 
  }
  @Override
  public String[] getParameterValues(String name) {
    String[] value = super.getParameterValues(name);
    if(value != null){
      for (int i = 0; i ", ">");
    value = value.replaceAll("'", "'");
    value = value.replaceAll(";", "﹔");
    value = value.replaceAll("&", "&");
    value = value.replaceAll("%", "﹪");
    value = value.replaceAll("#", "#");
    value = value.replaceAll("select", "seleᴄt");// "c"→"ᴄ"
    value = value.replaceAll("truncate", "trunᴄate");// "c"→"ᴄ"
    value = value.replaceAll("exec", "exeᴄ");// "c"→"ᴄ"
    value = value.replaceAll("join", "jᴏin");// "o"→"ᴏ"
    value = value.replaceAll("union", "uniᴏn");// "o"→"ᴏ"
    value = value.replaceAll("drop", "drᴏp");// "o"→"ᴏ"
    value = value.replaceAll("count", "cᴏunt");// "o"→"ᴏ"
    value = value.replaceAll("insert", "ins℮rt");// "e"→"℮"
    value = value.replaceAll("update", "updat℮");// "e"→"℮"
    value = value.replaceAll("delete", "delet℮");// "e"→"℮"
    
    value = value.replaceAll("script", "sᴄript");// "c"→"ᴄ"
    value = value.replaceAll("COOKIE", "cᴏᴏkie");// "o"→"ᴏ"
    value = value.replaceAll("iframe", "ifram℮");// "e"→"℮"
    value = value.replaceAll("onmouseover", "onmouseov℮r");// "e"→"℮"
    value = value.replaceAll("onmousemove", "onmousemov℮");// "e"→"℮"*/
    return value;
  } 
}

三. 配置web.xml添加过滤器



  XssSqlFilter
  com.cn.unit.filter.SafeFilter


  XssSqlFilter
  /*

配置各节点简单介绍:

节点名 介绍
指定一个过滤器
用于为过滤器指定一个名字,该元素的内容不能为空
指定过滤器的完整的限定类名
为过滤器指定初始化参数。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数
的子元素,指定参数的名字
的子元素,指定参数的值
设置一个Filter所负责拦截的资源。可通过Servlet名称或资源访问的请求路径指定
子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
指定过滤器所拦截的Servlet名称
指定过滤器所拦截的资源被 Servlet 容器调用的方式,默认REQUEST

四. 静态资源跳过过滤

在实际开发的过程中,js、css等静态资源也进行过滤,消耗服务器性能,因此把一些不必要过滤的直接跳过过滤器,实现如下:

4.1 在web.xml配置文件中添加参数,保存静态资源所在的路径


 excludeFilter
 /document/;/ligentres/

如图:

4.2 过滤器初始化方法,读取静态资源所在的路径

public FilterConfig filterConfig;
public String[] excludeFilterArray;
@Override
public void init(FilterConfig config) throws ServletException {
 filterCOnfig= config;
  // 读取web配置文件中的静态资源所在路径
 String excludeFilter = filterConfig.getInitParameter("excludeFilter");
 excludeFilterArray = excludeFilter.split(";");
}

4.3 过滤器拦截请求,若是静态资源所在的路径直接跳过过滤器

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpRequest = (HttpServletRequest) request;
  String uri = httpRequest.getRequestURI();
  // 静态资源直接跳过,不进行过滤
  if(uri==null||this.isContains(uri, excludeFilterArray)) {
   chain.doFilter(request, response);
   return;
  }
  ......
}

// 判断数组是否包含某一元素
public boolean isContains(String uri, String[] regx) {
  boolean result = false;
  for (int i = 0; i 

五. 大功告成

借鉴前人的经验,一开始测试的时候发现,普通的表单提交和ajax提交可以过滤其参数,但上传文件时就无法进入过滤了。

后来经过研究,用于处理文件上传的 MultipartResolver ,当收到请求时,DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest 对象中,最后传递给 Controller。因此我们只需要在定义过滤器时,先获取请求头判断是否为文件上传,若是再对数据进行解析便可。

到此这篇关于Java使用过滤器防止SQL注入XSS脚本注入的实现的文章就介绍到这了,更多相关Java 过滤器防止SQL注入 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 小程序服务器获取用户名头像,微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现...
    这个接口只能获得一些非敏感信息,例如用户昵称,用户头像,经过用户授权允许获取的情况下即可获得用户信息,至于openid这些& ... [详细]
  • 2月4日每日安全热点节日期间某企远程办公遭XRed攻击 ... [详细]
  • 通过存储型XSS漏洞获取目标用户本地私钥信息
    运维|安全存储型XSS漏洞,目标用户,本地,私钥信息运维-安全舍得网源码,vscode代码检查工具,ubuntu壁纸修改,tomcat网页部署项目,爬虫枯木,php采集文件,马鞍山 ... [详细]
author-avatar
Jason子宣_805
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有