1. ホーム
  2. java

[解決済み] サーブレットフィルタでリクエストパラメータを変更する

2022-08-31 08:46:23

質問

既存の Web アプリケーションが Tomcat 4.1 上で動作しています。 あるページにXSSの問題がありますが、ソースを修正することができません。 私は、ページによって見られる前にパラメータをサニタイズするために、サーブレットフィルタを書くことにしました。

このようなFilterクラスを書きたいと思います。

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);
    request.setParameter("dangerousParamName", goodValue);
    chain.doFilter(request, response);
  }

  public void destroy() {
  }

  public void init(FilterConfig filterConfig) {
  }
}

しかし ServletRequest.setParameter は存在しない。

リクエストをチェーンに渡す前に、リクエストパラメータの値を変更するにはどうすればよいですか。

どのように解決するのですか?

ご指摘の通り HttpServletRequest には setParameter メソッドがありません。これは意図的なもので、クラスはクライアントから来たリクエストを表し、パラメータを修正するとそれを表すことができないからです。

一つの解決策は HttpServletRequestWrapper クラスを使うことです。これは、あるリクエストを別のリクエストでラップすることを可能にします。これをサブクラス化して getParameter メソッドをオーバーライドして、サニタイズされた値を返します。そして、そのラップされたリクエストを chain.doFilter に渡すことができます。

少し醜いですが、サーブレット API がそうするように言っているのです。 もしあなたが他の何かを doFilter に他のものを渡そうとすると、いくつかのサーブレットコンテナは仕様に違反していると文句を言い、その処理を拒否するでしょう。

パラメータを処理するオリジナルのサーブレット/JSPを修正し、リクエストに 属性が必要です。 を期待するようにします。フィルタはパラメータを調べ、それをサニタイズし、属性を設定します (これは request.setAttribute を使って)サニタイズされた値で属性を設定します。サブクラス化もスプーフィングもありませんが、アプリケーションの他の部分を変更する必要があります。