我正在尝试使用 XSSFilter 来保护我的 Spring Boot 应用程序,如下所示:
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
}
和包装纸:
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
@Override
public String[] getParameterValues(String parameter) {
String[] values = super.getParameterValues(parameter);
if (values == null) {
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = replaceXSSCharacters((values[i]));
}
return encodedValues;
}
private String replaceXSSCharacters(String value) {
if (value == null) {
return null;
}
return value
.replace("&","&")
.replace("<", "<")
.replace(">",">")
.replace("\"",""")
.replace("'","'");
}
@Override
public String getParameter(String parameter) {
return replaceXSSCharacters(super.getParameter(parameter));
}
@Override
public String getHeader(String name) {
return replaceXSSCharacters(super.getHeader(name));
}
}
问题是,这只保护请求参数和标头,而不是请求主体,有时我的控制器使用 @RequestBody 接收数据。
所以,如果我向我的控制器提交一个像这样的 json:
{"name":"<script>alert('hello!')</script>"}
name 属性中的 html 字符没有像我需要的那样被转义。我怎样才能逃脱RequestBody?
编辑:
这与“重复”问题不同。我的问题非常具体。如何转义请求正文中的字符。