我有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
参数中移除列入黑名单的字符,例如alert
,username
。
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
我无法理解这里的问题。有人可以帮我吗?
答案 0 :(得分:0)
从您的问题来看,在我看来,您应该从服务器包装响应,而不是传入的请求。见:HttpServletResponseWrapper
这应该是改变你的包装器延伸的类,即
从
public final class ResponseWrapper extends HttpServletResponseWrapper
到
18:00 20
18:01 42
18:02 39
...
18:58 12
18:59 15
实施不应该改变(但我没有检查)。