既存の 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
サニタイズされた値で属性を設定します ( を使用)。サブクラス化やスプーフィングはありませんが、アプリケーションの他の部分を変更する必要があります。