解決反射型XSS漏洞攻擊

来源:https://www.cnblogs.com/han-sun/archive/2019/03/03/10463834.html
-Advertisement-
Play Games

對於程式員來說安全防禦,無非從兩個方面考慮,要麼前端要麼後臺。 一、首先從前端考慮過濾一些非法字元。 前端的主控js中,在<textarea> 輸入框標簽中,找到點擊發送按鈕後,追加到聊天panel前 進行過濾Input輸入內容 二、在後臺API服務解決反射型XSS漏洞 thinking:一般來說前 ...


對於程式員來說安全防禦,無非從兩個方面考慮,要麼前端要麼後臺。

一、首先從前端考慮過濾一些非法字元。

前端的主控js中,在<textarea> 輸入框標簽中,
找到點擊發送按鈕後,追加到聊天panel前 進行過濾Input輸入內容

 

 1         // 過濾XSS反射型漏洞
 2         filterInputTxt: function (html) {
 3             html = html.replace(/(.*<[^>]+>.*)/g,"");    // HTML標記
 4             html = html.replace(/([\r\n])[\s]+/g, "");    // 換行、空格
 5             html = html.replace(/<!--.*-->/g, "");    // HTML註釋
 6             html = html.replace(/['"‘’“”!@#$%^&*{}!¥()()×+=]/g, ""); // 非法字元
 7             html = html.replace("alert","");
 8             html = html.replace("eval","");
 9             html = html.replace(/(.*javascript.*)/gi,"");
10             if (html === "") {
11                 html = "你好";
12             }
13             return html;
14         }

 

二、在後臺API服務解決反射型XSS漏洞

thinking:一般來說前端可以過濾一下基本的非法惡意代碼攻擊,如果惡意腳本被請求到服務端啦,那麼就需要請求參數未請求介面前進行過濾一些非法字元。

handle:1、自定義過濾器實現Filter介面

    2、在doFilter方法中對request、response進行設置處理

 

##處理request請求參數。

  1 /*
  2  * Copyright (C), 2001-2019, xiaoi機器人
  3  * Author:   han.sun
  4  * Date:     2019/2/28 11:39
  5  * History:
  6  * <author>          <time>          <version>         <desc>
  7  * 作者姓名          修改時間          版本號            描述
  8  */
  9 package com.eastrobot.robotdev.filter;
 10 
 11 import javax.servlet.http.HttpServletRequest;
 12 import javax.servlet.http.HttpServletRequestWrapper;
 13 import java.util.Map;
 14 import java.util.regex.Matcher;
 15 import java.util.regex.Pattern;
 16 
 17 /**
 18  * 〈一句話功能簡述〉<br>
 19  * TODO(解決反射型XSS漏洞攻擊)
 20  *
 21  * @author han.sun
 22  * @version 1.0.0
 23  * @since 2019/2/28 11:39
 24  */
 25 public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 26 
 27     /**
 28      * 定義script的正則表達式
 29      */
 30     private static final String REG_SCRIPT = "<script[^>]*?>[\\s\\S]*?</script>";
 31 
 32     /**
 33      * 定義style的正則表達式
 34      */
 35     private static final String REG_STYLE = "<style[^>]*?>[\\s\\S]*?</style>";
 36 
 37     /**
 38      * 定義HTML標簽的正則表達式
 39      */
 40     private static final String REG_HTML = "<[^>]+>";
 41 
 42     /**
 43      * 定義所有w標簽
 44      */
 45     private static final String REG_W = "<w[^>]*?>[\\s\\S]*?</w[^>]*?>";
 46 
 47     private static final String REG_JAVASCRIPT = ".*javascript.*";
 48 
 49 
 50     XssHttpServletRequestWrapper(HttpServletRequest request) {
 51         super(request);
 52     }
 53 
 54     @SuppressWarnings("rawtypes")
 55     @Override
 56     public Map<String, String[]> getParameterMap() {
 57         Map<String, String[]> requestMap = super.getParameterMap();
 58         for (Object o : requestMap.entrySet()) {
 59             Map.Entry me = (Map.Entry) o;
 60             String[] values = (String[]) me.getValue();
 61             for (int i = 0; i < values.length; i++) {
 62                 values[i] = xssClean(values[i]);
 63             }
 64         }
 65         return requestMap;
 66     }
 67 
 68     @Override
 69     public String[] getParameterValues(String paramString) {
 70         String[] values = super.getParameterValues(paramString);
 71         if (values == null) {
 72             return null;
 73         }
 74         int i = values.length;
 75         String[] result = new String[i];
 76         for (int j = 0; j < i; j++) {
 77             result[j] = xssClean(values[j]);
 78         }
 79         return result;
 80     }
 81 
 82     @Override
 83     public String getParameter(String paramString) {
 84         String str = super.getParameter(paramString);
 85         if (str == null) {
 86             return null;
 87         }
 88         return xssClean(str);
 89     }
 90 
 91 
 92     @Override
 93     public String getHeader(String paramString) {
 94         String str = super.getHeader(paramString);
 95         if (str == null) {
 96             return null;
 97         }
 98         str = str.replaceAll("[\r\n]", "");
 99         return xssClean(str);
100     }
101     
102     /**
103      * [xssClean 過濾特殊、敏感字元]
104      * @param  value [請求參數]
105      * @return       [value]
106      */
107     private String xssClean(String value) {
108         if (value == null || "".equals(value)) {
109             return value;
110         }
111         Pattern pw = Pattern.compile(REG_W, Pattern.CASE_INSENSITIVE);
112         Matcher mw = pw.matcher(value);
113         value = mw.replaceAll("");
114 
115         Pattern script = Pattern.compile(REG_SCRIPT, Pattern.CASE_INSENSITIVE);
116         value = script.matcher(value).replaceAll("");
117 
118         Pattern style = Pattern.compile(REG_STYLE, Pattern.CASE_INSENSITIVE);
119         value = style.matcher(value).replaceAll("");
120 
121         Pattern htmlTag = Pattern.compile(REG_HTML, Pattern.CASE_INSENSITIVE);
122         value = htmlTag.matcher(value).replaceAll("");
123 
124         Pattern javascript = Pattern.compile(REG_JAVASCRIPT, Pattern.CASE_INSENSITIVE);
125         value = javascript.matcher(value).replaceAll("");
126         return value;
127     }
128 
129 }

 

 

##自定義Filter過濾器。

 1 /*
 2  * Copyright (C), 2001-2019, xiaoi機器人
 3  * Author:   han.sun
 4  * Date:     2019/2/28 11:38
 5  * History:
 6  * <author>          <time>          <version>         <desc>
 7  * 作者姓名          修改時間          版本號            描述
 8  */
 9 package com.eastrobot.robotdev.filter;
10 
11 import javax.servlet.*;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import java.io.IOException;
15 
16 /**
17  * 〈在伺服器端對 Cookie 設置了HttpOnly 屬性,
18  * 那麼js腳本就不能讀取到cookie,
19  * 但是瀏覽器還是能夠正常使用cookie〉<br>
20  * TODO(禁用js腳步讀取用戶瀏覽器中的Cookie)
21  *
22  * @author han.sun
23  * @version 1.0.0
24  * @since 2019/2/28 16:38
25  */
26 public class XssFilter implements Filter {
27 
28     @Override
29     public void init(FilterConfig filterConfig) throws ServletException {
30 
31     }
32 
33     @Override
34     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
35 
36         HttpServletRequest req = (HttpServletRequest) request;
37         HttpServletResponse resp = (HttpServletResponse) response;
38 
39         // 解決動態腳本獲取網頁cookie,將cookie設置成HttpOnly
40         String sessionId = req.getSession().getId();
41         resp.setHeader("SET-COOKIE", "JSESSIONID=" + sessionId + "; HttpOnly");
42         resp.setHeader("x-frame-options", "SAMEORIGIN");
43 
44         chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
45     }
46 
47     @Override
48     public void destroy() {
49     }
50 }

 

 

需要在web.xml文件中添加自定義過濾器映射,讓其起作用

1 <filter>
2 <filter-name>XssEscape</filter-name>
3 <filter-class>com.eastrobot.robotdev.filter.XssFilter</filter-class>
4 </filter>
5 <filter-mapping>
6 <filter-name>XssEscape</filter-name>
7 <url-pattern>/*</url-pattern>
8 </filter-mapping>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 計算屬性 1.1 什麼是計算屬性: 插值表達式常用於簡單的運算,當其過長或邏輯複雜時,會難以維護,這時應該使用計算屬性。 插值表達式里的值是JS表達式 所有的計算屬性都以函數的形式寫在Vue實例內的computed選項內,最終返回計算後的結果。 1.2 計算屬性的用法 在一個計算屬性里可以完成各種復 ...
  • MVC設計模式:modle層,view層,controller層 以前學習的servlet其實就是一個java類,或者說經過規範的java類,實際進行跳轉時,還是要在web.xml文件中配置才能正常跳轉。 controller層可以放servlet,在SpringMVC中則可以創建java類通過@c ...
  • 1.hello 1.hello 1.hello 1.hello 消息生產者p將消息放入隊列 消費者監聽隊列,如果隊列中有消息,就消費掉,消息被拿走後,自動從隊列刪除(隱患,消息可能沒有被消費者正確處理,已經消失了,無法恢復) 應用場景:聊天室 案例: 1>.首先準備依賴 <dependency> < ...
  • 環境配置 部署環境 部署環境:windows server 2008 r2 enterprise 官方安裝部署文檔:http://www.rabbitmq.com/install-windows.html官方文檔說明 下載erlang 原因在於RabbitMQ服務端代碼是使用併發式語言erlang編 ...
  • 究竟啥才是互聯網架構“高併發” 一、什麼是高併發 高併發(High Concurrency)是互聯網分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。 高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查 ...
  • 一、啥是數據解析 在上一篇關於爬蟲的博客里,我提到過,整個爬蟲分為四個部分,上一篇博客已經完成了前兩步,也就是我說的最難的地方,接下來這一步數據解析不是很難,但就是很煩人,但只要你有耐心,一步一步查找、排除就會提取出目標信息,這一步就相當於從接收到的龐大數據中提取出真正想要、有意義的信息,所以對於爬 ...
  • Django之路:安裝與配置 MTV Model Template View 資料庫 模版文件 業務處理 瞭解Django框架,功能齊全 一.安裝Django&Django基本配置 安裝Django pip3 django 配置Django 1.配置Django環境變數 D:\Program fil ...
  • 從生成器到協程 協程是指一個過程,這個過程與調用方協作,產出由調用方提供的值。生成器的調用方可以使用 .send(...)方法發送數據,發送的數據會成為yield表達式的值。因此,生成器可以作為協程使用。 從句法上看,生成器與協程都是包含yield關鍵字的函數。但是,在協程中,yield通常出現在表 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...