最近客户安全管理组扫描已交付的程序,发现程序存在xss漏洞,于是要求修复。修复的建议是将请求的所有url和参数做过滤。于是有同事在增加了一个过滤器,这个过滤器继承了HttpServletRequestWrapper类,代码如下:
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.lang3.StringEscapeUtils;
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
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] = stripXSS(values[i]);
}
return encodedValues;
}
public String getRequestURI() {
String uri = super.getRequestURI();
try {
uri = URLDecoder.decode(uri, "UTF-8");
} catch (Exception e) {
}
return stripXSS(uri);
}
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
return stripXSS(value);
}
public String getHeader(String name) {
String value = super.getHeader(name);
return stripXSS(value);
}
private String stripXSS(String value) {
if (value != null) {
value = StringEscapeUtils.escapeHtml3(value);
}
return value;
}
}
在这个类中,引用了org.apache.commons.lang3.StringEscapeUtils,使用了StringEscapeUtils类的public static final String escapeHtml3(String input)方法对请求中的参数做过滤。
Struts的方法在收到这个前台页面发送来请求时,处理请求。其中,取得参数时,发现经过ajax传递到后台参数中的中文都被转成中文了。后来在后台的方法中获取参数后再调用StringEscapeUtils的另一个方法转码就无问题了。
String json = request.getParameter("jsonStr");
json = StringEscapeUtils.unescapeHtml3(json);