サーブレットフィルタを使用してリクエストパラメータを変更する 質問する

サーブレットフィルタを使用してリクエストパラメータを変更する 質問する

既存の 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存在しません。

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

ベストアンサー1

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

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

少し見苦しいですが、サーブレット API ではそうすべきとされています。 に他のものを渡そうとするとdoFilter、一部のサーブレット コンテナは仕様に違反していると警告し、処理を拒否します。

より洗練された解決策は、より多くの作業が必要です。パラメータを処理する元のサーブレット/JSPを変更して、リクエストを期待するようにします。属性パラメータの代わりに を使用します。フィルタはパラメータを調べ、それをサニタイズし、request.setAttributeサニタイズされた値で属性を設定します ( を使用)。サブクラス化やスプーフィングはありませんが、アプリケーションの他の部分を変更する必要があります。

おすすめ記事