Java使用servlet过滤器修改请求参数
现有的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不存在。
在将请求向下传递之前,如何更改请求参数的值?
回答:
如前所述HttpServletRequest
,没有setParameter方法。这是故意的,因为该类表示来自客户端的请求,而修改参数将不表示该请求。
一种解决方案是使用HttpServletRequestWrapper
类,该类使你可以将一个请求与另一个请求包装在一起。你可以对其进行子类化,并重写该getParameter方法以返回经过清理的值。然后,你可以将该包装的请求传递给chain.doFilter
而不是原始请求。
这有点丑陋,但这就是servlet API所说的。如果你尝试将其他任何内容传递给doFilter,则某些servlet容器会抱怨你违反了规范,并拒绝处理它。
一个更好的解决方案是更多的工作-修改处理该参数的原始servlet / JSP,以便它期望使用请求属性而不是参数。过滤器检查参数,将其净化,然后使用request.setAttribute
净化值设置属性(使用)。没有子类,没有欺骗,但确实需要你修改应用程序的其他部分。
以上是 Java使用servlet过滤器修改请求参数 的全部内容, 来源链接: utcz.com/qa/434119.html