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

标签 java servlet-filters

现有的 Web 应用程序正在 Tomcat 4.1 上运行。页面存在 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);
    request.setParameter("dangerousParamName", goodValue);
    chain.doFilter(request, response);
  }

  public void destroy() {
  }

  public void init(FilterConfig filterConfig) {
  }
}

但是ServletRequest.setParameter不存在。

如何在将请求传递到链之前更改请求参数的值?

最佳答案

正如您所注意到的,HttpServletRequest 没有 setParameter 方法。这是故意的,因为该类代表来自客户端的请求,修改参数不会代表该请求。

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

这有点难看,但这是 servlet API 告诉您应该做的。如果您尝试将任何其他内容传递给 doFilter,一些 servlet 容器会提示您违反了规范,并拒绝处理它。

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

关于java - 使用 servlet 过滤器修改请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772474/

相关文章:

JSF 登录过滤器, session 为空

java - 无法使用 Slick2d 和 Java 获取列表

java - 无法从 PC 找到 Android 应用程序创建的文件夹

java - 使用备忘录模式(和命令)存储复杂对象的状态

Java - Tuckee URL Rewrite 过滤器如何更改请求的 URL?

java - 为什么 session 超时后无法访问 servlet?

java - 如何点击“立即申请”按钮

java - 如果 start() 出现异常,则终止 Jetty 服务器线程池

java - 在使用请求调度程序转发的 servlet 内使用 sendRedirect

java - JSF 和过滤器重定向生成空白页