HttpServletRequestWrapper - 无法修改请求标头

时间:2015-06-25 09:03:15

标签: java xss servlet-filters servlet-3.0

我有servlet filter调用RequestWrapper类来检查和修改请求标头。

public final class RequestWrapper extends HttpServletRequestWrapper

我在getHeader类中覆盖RequestWrapper方法来修改请求标头。

public String getHeader(String name) {
    String value = super.getHeader(name);
    if (value == null)
      return null;
    return removeUnexpectedCharacters(value);
}

private String removeUnexpectedCharacters(String value)
{
    value = value.replaceAll("script", "");
    value = value.replaceAll("alert", "");
    System.out.println("before return: " + value);
    return value;
}

在服务器日志中,我可以看到此代码正在执行,实际上它也正在删除字符,但是当response呈现给浏览器时,它也包含已删除的字符。

当我从服务器请求具有以下网址的网页时,它应该从script参数中移除列入黑名单的字符,例如alertusername

https://xxx:8443/ProjectName/login?username=%3E%22%27%3E%3Cscript%3Ealert%2860%29%3C%2Fscript%3E

预期网址:

https://xxx:8443/ProjectName/login?username=%3E%22%27%3E%3C%3E%2860%29%3C%2F%3E

我无法理解这里的问题。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

从您的问题来看,在我看来,您应该从服务器包装响应,而不是传入的请求。见:HttpServletResponseWrapper 这应该是改变你的包装器延伸的类,即

public final class ResponseWrapper extends HttpServletResponseWrapper

18:00 20
18:01 42
18:02 39
...
18:58 12
18:59 15

实施不应该改变(但我没有检查)。