」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 禁止更改原始程式碼時如何使用 Servlet 過濾器修改請求參數?

禁止更改原始程式碼時如何使用 Servlet 過濾器修改請求參數?

發佈於2024-12-21
瀏覽:801

How to Modify Request Parameters with a Servlet Filter When Source Code Changes Are Forbidden?

使用Servlet Filter修改請求參數

使用Servlet Filter修改請求參數

在現有的Web應用程式中,您面臨XSS漏洞,並被禁止修改原始碼。為了解決這個問題,您打算利用 servlet 過濾器在請求參數到達易受攻擊的頁面之前對其進行清理。
import java.io.*;
import javax.servlet.*;

public final class XssFilter implements Filter {

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException
  {
    String badValue = request.getParameter("dangerousParamName");
    String goodValue = sanitize(badValue);
    // Unable to modify parameter using request.setParameter
    chain.doFilter(request, response);
  }

  public void destroy() {
  }

  public void init(FilterConfig filterConfig) {
  }
}

import java.io.*; 導入 javax.servlet.*; 公共最終類別 XssFilter 實作 Filter { public void doFilter(ServletRequest 請求, ServletResponse 回應, FilterChain 鏈) 拋出 IOException、ServletException { String badValue = request.getParameter("dan​​gerousParamName"); 字串 goodValue = 清理(badValue); // 無法使用request.setParameter修改參數 chain.doFilter(請求,回應); } 公共無效銷毀(){ } 公共無效初始化(FilterConfig過濾器配置){ } }

但是,您遇到了一個障礙:HttpServletRequest 缺少 setParameter 方法。若要克服此限制,請考慮以下方法:

使用 HttpServletRequestWrapper:

使用 HttpServletRequestWrapper:

利用 HttpServletRequestWrapper 類別圍繞原始請求建立包裝器。您可以重寫 getParameter 方法以傳回清理後的值。然後,將包裝後的請求傳遞給 chain.doFilter 而不是原始請求。

此方法需要子類化並包裝原始請求,但透過將過濾委託給包裝後的請求來符合 servlet API。

設定請求屬性:How to Modify Request Parameters with a Servlet Filter When Source Code Changes Are Forbidden?

或者,您可以修改目標 servlet 或 JSP 以期望請求屬性比危險參數的請求參數。然後,您的過濾器可以檢查參數,對其進行清理,並使用 request.setAttribute.使用清理後的值來設定請求屬性。此方法更優雅,因為它避免了子類化或欺騙,但需要修改應用程式的程式碼使用請求屬性而不是參數。

最新教學 更多>
  • 為什麼 Margin Top 不適用於 CSS 中的內聯元素?
    為什麼 Margin Top 不適用於 CSS 中的內聯元素?
    頂部邊距和內聯元素在 CSS 中,margin 屬性用於定義元素邊框之外的間距。然而,在內聯元素上使用 margin top 時會出現一個常見問題,特別是在 Firefox 中。 問題:為什麼內聯元素的 margin top 似乎被忽略在 Firefox 中? 答案:此行為並非 Firefox 獨有...
    程式設計 發佈於2024-12-21
  • 如何使用XPath透過CSS類別高效定位HTML元素?
    如何使用XPath透過CSS類別高效定位HTML元素?
    使用 XPath 按 CSS 類別尋找元素在網頁擷取中,通常需要根據 CSS 類別來定位 HTML 元素。 XPath 是一個用於導航 XML 和 HTML 文件的強大工具,它提供了一種實現此目的的方法。 考慮一個 HTML 頁面,其中的 div 元素具有名為「Test」的類別。以下XPath 查詢...
    程式設計 發佈於2024-12-21
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-12-21
  • 為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    為什麼 `array_shift()` 會觸發「嚴格標準:只有變數應該透過引用傳遞」?
    錯誤訊息「Strict Standards: Only Variables Should Be Passed by Reference」使用array_shift() 時,可能會報告嚴格標準如果傳遞的參數是函數呼叫的結果,則會發出警告。這種行為看起來不一致,因為它並不總是觸發警告。 考慮以下程式碼:...
    程式設計 發佈於2024-12-21
  • 如何在 Pandas 中進行聚合?
    如何在 Pandas 中進行聚合?
    Pandas 中的聚合如何使用 Pandas 執行聚合? 聚合函數會降低傳回物件的維度。一些常見的聚合函數包括mean()、sum()、size()、count()、std()、var()和sem()。 df1 = df.groupby(['A', 'B'], as_index=False)['C'...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    如何在 C++ 中初始化靜態 `const std::string` 資料成員?
    宣告const std::string 類型的靜態資料成員在C 中,直接在類別定義中初始化const std::string 類型的靜態資料成員是不允許。相反,有兩個選項可以定義此類資料成員:內聯變數(C 17 或更高版本)使用內聯變量,它定義並初始化類別定義中的靜態成員:class A { pri...
    程式設計 發佈於2024-12-21
  • 如何在 Python 中從函數內部取得函數名稱?
    如何在 Python 中從函數內部取得函數名稱?
    從函數內部存取函數名稱在Python 中,從函數本身內部確定函數名稱在動態自省的情況下非常有用inspect 模組提供了一個方便的機制來獲取有關正在運行的程式碼的資訊。使用inspect.stack(),我們可以存取表示目前呼叫堆疊的幀列表。 對於給定的函數,堆疊列表中的第一幀對應於當前函數,而第二...
    程式設計 發佈於2024-12-21
  • 如何將電子表格列索引號轉換為其等效字母?
    如何將電子表格列索引號轉換為其等效字母?
    將電子表格列索引轉換為字母在 Google 表格中,列用數字索引,從 1 開始。但是,為了方便起見,它們通常也使用字母來表示(例如,“A”表示第一列,“D”表示第四列)。數字索引和字母值之間的轉換通常是腳本任務所必需的。 實作此轉換的一種方法是透過以下函數:function getColumnLet...
    程式設計 發佈於2024-12-21
  • 為什麼 `reader.ReadString` 不刪除初始分隔符號?
    為什麼 `reader.ReadString` 不刪除初始分隔符號?
    reader.ReadString 不會去掉初始分隔符號reader.ReadString 不會去掉初始分隔符號為了創建一個程式來迎接名為Alice 或Bob 的用戶,開發人員遇到一個問題,即使是合法的名稱也會引發不受歡迎的回應。程式錯誤地拒絕了 Alice 和 Bob 的進入。 問題此問題源自於程...
    程式設計 發佈於2024-12-21
  • 如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    如何透過ServletContext存取WAR/WEB-INF目錄下的資源?
    透過ServletContext存取WAR/WEB-INF目錄中的資源簡介: Java Web 應用程式通常將重要資源儲存在WAR/WEB-INF 目錄中。要存取這些資源,開發人員可以利用 ServletContext API。 問題:如何創建位於 WAR/WEB-INF中的資源的正確路徑資料夾,例...
    程式設計 發佈於2024-12-21
  • 如何使用 Bootstrap 隱藏響應式佈局中的元素?
    如何使用 Bootstrap 隱藏響應式佈局中的元素?
    使用Bootstrap 隱藏響應式佈局中的元素設計響應式佈局時,管理空間變得至關重要,尤其是在較小的螢幕上。 Bootstrap 為行動裝置提供了對折疊功能表列專案的支持,但是如果您想類似地隱藏其他頁面元素怎麼辦? 解決方案:解決方案:Bootstrap 提供了允許您的類別根據螢幕尺寸隱藏元素:超小...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    如何修復嵌入式Python中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤?
    解決嵌入式Python 中的「Py_Initialize:無法載入檔案系統編解碼器」錯誤嘗試將嵌入式Python 3.2 解譯器整合到對於C 應用程序,可能會出現指示“無法載入檔案系統編解碼器”的錯誤。當 Py_Initialize 函數無法註冊編解碼器搜尋函數時,會發生此錯誤。 要解決此問題,必須...
    程式設計 發佈於2024-12-21
  • JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    JavaScript 可以捕獲網頁螢幕截圖並將其發送到伺服器嗎?
    使用 JavaScript 擷取網頁螢幕截圖:可能嗎? 在基於 Web 的應用程式無所不在的世界中,對網頁進行螢幕截圖已成為可能成為開發人員和使用者的重要任務。然而,問題出現了:使用 JavaScript 捕獲網頁截圖並提交回伺服器是否可行? 使用 JavaScript 進行網頁截圖的挑戰由於由於瀏...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3