最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用過濾器防止SQL注入XSS腳本注入的實現

 更新時間:2021年01月12日 09:51:34   作者:踮腳敲代碼  
這篇文章主要介紹了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的創(chuàng)建和銷毀由WEB服務器負責。 
 * Web應用程序啟動時,Web服務器將創(chuàng)建Filter的實例對象,并調用其init方法,讀取web.xml配置,
 * 完成對象的初始化功能,從而為后續(xù)的用戶請求作好攔截的準備工作。
 * Filter對象只會創(chuàng)建一次,init方法也只會執(zhí)行一次。
 * 開發(fā)人員通過init方法的參數,可獲得代表當前Filter配置信息的FilterConfig對象。
 */
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
   filterConfig = config;
 }
 
 /**
   * 攔截請求
   * 這個方法完成實際的過濾操作。當客戶請求訪問與過濾器關聯的URL的時候,Servlet過濾器將先執(zhí)行doFilter方法。
   * FilterChain參數用于訪問后續(xù)過濾器。
   */
  @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對象創(chuàng)建后會駐留在內存,當Web應用移除或服務器停止時才銷毀。在Web容器卸載Filter對象之前被調用。
   * 該方法在Filter的生命周期中僅執(zhí)行一次。在這個方法中,可以釋放過濾器使用的資源。
   */
  @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.length; i++) {
        value[i] = xssEncode(value[i]);
      }
    }
    return value;
  }
 @Override
  public Map getParameterMap() {
    return super.getParameterMap();
  }
  
 /**
 * 請求頭不過濾
 */
  @Override 
  public String getHeader(String name) { 
   return super.getHeader(name);
  } 
  
  /** 
   * 將容易引起注入的關鍵字的半角字符直接替換成全角字符
   * @param value 過濾前的值
   * @return 過濾后的值
   */ 
  private static String xssEncode(String value) { 
    if (value == null || value.isEmpty()) {
      return value;
    }
    // 防SQL注入轉義
 value = StringEscapeUtils.escapeSql(value);
 
 // HTML防注入,個人建議使用第三種
    // 1.防HTML注入轉義(HtmlUtils工具類,漢字不轉義,雙引號轉義,存在JSON封裝需要反轉義)
    value = HtmlUtils.htmlEscape(value);
    /*
    // 2.防HTML注入轉義(StringEscapeUtils工具類,漢字也轉義,取出時需要反轉義)
    // value = StringEscapeUtils.escapeHtml(value);
    // 3.字符串替換法(通過各種循環(huán)替換字符串測試,最終還是replace替換效果最佳)
    value = value.replaceAll("<", "<");
    value = value.replaceAll(">", ">");
    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添加過濾器

<!-- 配置過濾器防止SQL注入XSS注入 -->
<filter>
  <filter-name>XssSqlFilter</filter-name>
  <filter-class>com.cn.unit.filter.SafeFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>XssSqlFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

配置各節(jié)點簡單介紹:

節(jié)點名 介紹
<filter> 指定一個過濾器
<filter-name> 用于為過濾器指定一個名字,該元素的內容不能為空
<filter-class> 指定過濾器的完整的限定類名
<init-param> 為過濾器指定初始化參數。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數
<param-name> <init-param>的子元素,指定參數的名字
<param-value> <init-param>的子元素,指定參數的值
<filter-mapping> 設置一個Filter所負責攔截的資源??赏ㄟ^Servlet名稱或資源訪問的請求路徑指定
<filter-name> 子元素用于設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
<url-pattern> 設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
<servlet-name> 指定過濾器所攔截的Servlet名稱
<dispatcher> 指定過濾器所攔截的資源被 Servlet 容器調用的方式,默認REQUEST

四. 靜態(tài)資源跳過過濾

在實際開發(fā)的過程中,js、css等靜態(tài)資源也進行過濾,消耗服務器性能,因此把一些不必要過濾的直接跳過過濾器,實現如下:

4.1 在web.xml配置文件中添加參數,保存靜態(tài)資源所在的路徑

<init-param>
 <param-name>excludeFilter</param-name><!-- 靜態(tài)資源不進行過濾,如js、css文件 -->
 <param-value>/document/;/ligentres/</param-value>
</init-param>

如圖:

4.2 過濾器初始化方法,讀取靜態(tài)資源所在的路徑

public FilterConfig filterConfig;
public String[] excludeFilterArray;
@Override
public void init(FilterConfig config) throws ServletException {
 filterConfig = config;
  // 讀取web配置文件中的靜態(tài)資源所在路徑
 String excludeFilter = filterConfig.getInitParameter("excludeFilter");
 excludeFilterArray = excludeFilter.split(";");
}

4.3 過濾器攔截請求,若是靜態(tài)資源所在的路徑直接跳過過濾器

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpRequest = (HttpServletRequest) request;
  String uri = httpRequest.getRequestURI();
  // 靜態(tài)資源直接跳過,不進行過濾
  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 < regx.length; i++) {
   if (uri.indexOf(regx[i]) != -1) {
   return true;
   }
  }
  return result;
}

五. 大功告成

借鑒前人的經驗,一開始測試的時候發(fā)現,普通的表單提交和ajax提交可以過濾其參數,但上傳文件時就無法進入過濾了。

后來經過研究,用于處理文件上傳的 MultipartResolver ,當收到請求時,DispatcherServlet 的 checkMultipart() 方法會調用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件。如果請求數據中包含文件,則調用 MultipartResolver 的 resolveMultipart() 方法對請求的數據進行解析,然后將文件數據解析成 MultipartFile 并封裝在 MultipartHttpServletRequest 對象中,最后傳遞給 Controller。因此我們只需要在定義過濾器時,先獲取請求頭判斷是否為文件上傳,若是再對數據進行解析便可。

到此這篇關于Java使用過濾器防止SQL注入XSS腳本注入的實現的文章就介紹到這了,更多相關Java 過濾器防止SQL注入 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 隱藏idea的.idea和.mvn文件的解決方案

    隱藏idea的.idea和.mvn文件的解決方案

    這篇文章主要介紹了隱藏idea的.idea和.mvn文件的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java static(靜態(tài)變量)和私有化功能與用法分析

    Java static(靜態(tài)變量)和私有化功能與用法分析

    這篇文章主要介紹了Java static(靜態(tài)變量)和私有化功能與用法,結合具體實例形式分析了Java static(靜態(tài)變量)和私有化的相關概念、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2019-07-07
  • 一篇文章教你如何在SpringCloud項目中使用OpenFeign

    一篇文章教你如何在SpringCloud項目中使用OpenFeign

    這篇文章主要介紹了SpringCloud 使用Open feign 優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08
  • Java多線程4種拒絕策略小結

    Java多線程4種拒絕策略小結

    當線程池中的任務隊列已滿且無法再接受新的任務時,就需要采取拒絕策略來處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見的拒絕策略,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 基于Spring BeanUtils的copyProperties方法使用及注意事項

    基于Spring BeanUtils的copyProperties方法使用及注意事項

    這篇文章主要介紹了基于Spring BeanUtils的copyProperties方法使用及注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 舉例說明Java中代碼塊的執(zhí)行順序

    舉例說明Java中代碼塊的執(zhí)行順序

    這篇文章主要介紹了舉例說明Java中代碼塊的執(zhí)行順序,包括靜態(tài)屬性和非靜態(tài)屬性以及構造函數等相關的執(zhí)行先后,需要的朋友可以參考下
    2015-07-07
  • Springboot實現接口傳輸加解密的步驟詳解

    Springboot實現接口傳輸加解密的步驟詳解

    這篇文章主要給大家詳細介紹了Springboot實現接口傳輸加解密的操作步驟,文中有詳細的圖文解釋和代碼示例供大家參考,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • mybatis注解如何實現對象批量更改

    mybatis注解如何實現對象批量更改

    這篇文章主要介紹了mybatis注解實現對象批量更改的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 實戰(zhàn)項目錘煉之在線購書商城系統的實現流程

    Java 實戰(zhàn)項目錘煉之在線購書商城系統的實現流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+mysql+servlet+ajax實現一個在線購書商城系統,大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • java實現解析二進制文件的方法(字符串、圖片)

    java實現解析二進制文件的方法(字符串、圖片)

    本篇文章主要介紹了java實現解析二進制文件的方法(字符串、圖片),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

曲阜市| 水富县| 博客| 宜城市| 镇坪县| 柳河县| 启东市| 渝中区| 武乡县| 新平| 漳州市| 绍兴市| 赤水市| 涞水县| 莱芜市| 桃园市| 阿拉善左旗| 喀喇沁旗| 托克托县| 大同县| 缙云县| 资溪县| 崇礼县| 忻州市| 小金县| 浦县| 巴彦淖尔市| 元氏县| 元朗区| 保康县| 静安区| 松桃| 乌鲁木齐市| 巴塘县| 铜陵市| 比如县| 睢宁县| 习水县| 大洼县| 舞钢市| 天镇县|