小编典典

Java使用servlet过滤器修改请求参数

java

现有的Web应用程序正在Tomcat 4.1上运行。页面存在XSS问题,但是我无法修改源代码。我决定编写一个servlet过滤器以在页面看到参数之前对其进行清理。

我想这样编写一个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不存在。

在将请求向下传递之前,如何更改请求参数的值?


阅读 1696

收藏
2020-03-09

共1个答案

小编典典

如前所述HttpServletRequest,没有setParameter方法。这是故意的,因为该类表示来自客户端的请求,而修改参数将不表示该请求。

一种解决方案是使用HttpServletRequestWrapper类,该类使你可以将一个请求与另一个请求包装在一起。你可以对其进行子类化,并重写该getParameter方法以返回经过清理的值。然后,你可以将该包装的请求传递给chain.doFilter而不是原始请求。

这有点丑陋,但这就是servlet API所说的。如果你尝试将其他任何内容传递给doFilter,则某些servlet容器会抱怨你违反了规范,并拒绝处理它。

一个更好的解决方案是更多的工作-修改处理该参数的原始servlet / JSP,以便它期望使用请求属性而不是参数。过滤器检查参数,将其净化,然后使用request.setAttribute净化值设置属性(使用)。没有子类,没有欺骗,但确实需要你修改应用程序的其他部分。

2020-03-09