现有的 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/