日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:124日期:2022-08-18 15:02:43

前幾天有個客戶在系統上寫了一段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.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.字符串替換法(通過各種循環替換字符串測試,最終還是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>

配置各節點簡單介紹:

節點名 介紹 <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

四. 靜態資源跳過過濾

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

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

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

如圖:

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

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

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

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

@Overridepublic 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 < regx.length; i++) { if (uri.indexOf(regx[i]) != -1) { return true; } } return result;}五. 大功告成

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

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

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91麻豆精品| 欧美日韩精品免费观看视完整| 快播电影网址老女人久久| 大香伊人久久精品一区二区 | 日韩欧美一区二区三区在线视频| 国产精选一区| 久久精品人人| 国产一区二区三区黄网站 | 精品久久中文| 伊伊综合在线| 亚洲二区视频| 亚洲欧美日韩国产| 日韩精品视频一区二区三区| 国产欧美日韩免费观看| 美女性感视频久久| 亚洲最新无码中文字幕久久| 日韩欧美不卡| 欧美aa国产视频| 国产综合亚洲精品一区二| 国产精品97| 亚洲三级精品| 国产精品网址| 亚洲综合电影| 久久99伊人| 欧美日韩亚洲一区| 日本一区二区高清不卡| 999国产精品999久久久久久| 99在线|亚洲一区二区| 亚洲va久久久噜噜噜久久| 国产欧美日韩综合一区在线播放| 国产精品99一区二区三| 激情欧美亚洲| 日韩福利视频网| 精品日韩一区| 99国产精品免费视频观看| 丝袜国产日韩另类美女| 国产欧美日韩在线观看视频| 黄在线观看免费网站ktv| 亚洲国产一区二区在线观看| 亚洲不卡视频| 黄色在线观看www| 亚洲午夜免费| 久久字幕精品一区| re久久精品视频| 国产日本亚洲| 99视频精品视频高清免费| 亚洲久久在线| 日韩精品免费一区二区在线观看| 亚洲欧美日本视频在线观看| 国产精品久久久久9999高清| 99久久夜色精品国产亚洲狼| 欧美日韩亚洲三区| 激情综合网五月| 国产乱码精品一区二区三区亚洲人| 日韩黄色大片网站| 日韩一区二区三区免费视频| 欧美日韩国产观看视频| 一本综合精品| 精品国产美女a久久9999| 国产精品社区| 国内不卡的一区二区三区中文字幕| 亚洲精品123区| 欧美激情视频一区二区三区免费 | 你懂的亚洲视频| 美女亚洲一区| 国产精品成人自拍| 亚洲黄色在线| 欧美日韩国产观看视频| 日韩精品a在线观看91| 欧美天堂视频| 国产探花一区| 亚洲一区免费| 精品九九在线| 婷婷综合电影| 国产国产精品| 色婷婷综合网| 国产亚洲精品美女久久| 宅男噜噜噜66国产日韩在线观看| 美女久久精品| 日韩亚洲精品在线观看| 蜜桃视频欧美| 日韩88av| 久久av影视| 中文字幕亚洲在线观看| 久久国产欧美| 久久只有精品| 欧美日韩中文| 香蕉久久久久久久av网站| 国产精品高颜值在线观看| 国产日韩高清一区二区三区在线 | 日韩精品欧美大片| 99国产成+人+综合+亚洲欧美| 精品欠久久久中文字幕加勒比| 日韩av网站在线免费观看| 久久国产精品久久久久久电车| 中文另类视频| 国产精品99一区二区三| 老鸭窝一区二区久久精品| 久久亚洲电影| 欧美日韩免费观看一区=区三区 | 国产盗摄——sm在线视频| 国产亚洲高清一区| 日韩精品一卡二卡三卡四卡无卡| 成人羞羞在线观看网站| 久久久91麻豆精品国产一区| 欧美亚洲tv| 色综合视频一区二区三区日韩 | 亚洲大片在线| 成人羞羞在线观看网站| 中文av在线全新| 久久免费福利| 91亚洲无吗| 日韩精品免费视频人成 | 91精品二区| 久久视频国产| 亚洲a在线视频| 成人久久一区| 激情久久久久久久| 在线国产一区二区| 国产综合婷婷| 国产在线成人| 欧美jjzz| 日韩一级精品| 亚洲午夜久久| 日韩欧美高清一区二区三区| 亚洲一区区二区| 亚洲综合精品四区| 亚洲丝袜啪啪| 日韩高清不卡在线| 日韩精品福利一区二区三区| 91成人精品观看| 国产精品一区二区美女视频免费看| 久久国产精品色av免费看| 久久精品97| 欧美国产日本| www.51av欧美视频| 久久美女性网| 中文精品在线| 日本不卡视频一二三区| 国产日韩在线观看视频| 日韩福利视频网| 久久免费精品| 日韩欧美另类一区二区| 婷婷综合网站| 亚洲欧美日韩精品一区二区 | 韩国久久久久久| 日韩精品电影| 尹人成人综合网| 中文字幕日韩高清在线| 日韩精品视频在线看| 91在线成人| 四季av一区二区凹凸精品| 欧美一区二区三区高清视频 | 日韩动漫一区| 国产一区二区三区久久久久久久久| 欧美羞羞视频| 亚洲天堂av资源在线观看| 国产欧美日韩| 日韩理论视频| 国产精品免费看| 国产香蕉精品| 国产成人精品一区二区三区视频 | 国产精久久久| 麻豆视频在线看| 久久国产影院| 日韩在线黄色| 成人精品高清在线视频| 欧美~级网站不卡| 最新国产精品久久久| 免费看久久久| 亚洲国内精品| 日韩区欧美区| 特黄毛片在线观看| 日韩精品一区第一页| 国产精品theporn| 久久一区二区三区喷水| 日韩精彩视频在线观看| 三级精品视频| 91大神在线观看线路一区| 久久久成人网| 日本成人中文字幕在线视频| 美女av在线免费看| 亚洲精品麻豆| 久久男人av资源站| 亚洲精品日本| 欧美sss在线视频| 日本午夜免费一区二区| 99久久精品网站| 97se亚洲| 亚洲精品小说| 国产精品宾馆| 国产偷自视频区视频一区二区| 国产九九精品| 午夜亚洲福利在线老司机| 精品视频99| 亚洲精品少妇| 久久精品主播| 国产精品www994| 欧美另类综合| 成人精品国产亚洲|