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

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

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

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.使用清理後的值來設定請求屬性。此方法更優雅,因為它避免了子類化或欺騙,但需要修改應用程式的程式碼使用請求屬性而不是參數。

最新教學 更多>

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

Copyright© 2022 湘ICP备2022001581号-3