为了防止xss攻击 ,写了个过滤器 又写了个类通过继承HttpServletRequestWrapper来实现在过滤器中修改request的值, 功能实现了,但现在出现一个新问题, 如果jsp页面有jsp:param这个标签 那jsp:param得值在过滤器直接给过滤掉了 就是说jsp:include的另外一个jsp再拿jsp的值 拿不到…..
解决办法如下:
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ParameterRequestWrapper extends HttpServletRequestWrapper{
private Map<String, String[]> params;
public ParameterRequestWrapper(HttpServletRequest request,
Map<String, String[]> newParams) {
super(request);
this.params = newParams;
}
@Override
public String getParameter(String name) {
String result = "";
//super.getParameterValues(name);这里是从原始request中获取对象值
//所以我们先检查我们过滤后的params中是否有该值
//如果没有我们在从原来的里面拿 像jsp:param这种在过滤的时候过滤不到....
//也就是如果正常参数我们从params里面拿 其他的从原来的拿
//鬼知道jsp:param放在哪儿了,paramtermap中拿不到,如果有了解的请讲解一下
Object v=null;
if(params.containsKey(name)){
v = params.get(name);
}else{
v = super.getParameterValues(name);
}
if (v == null) {
result = null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
result = strArr[0];
} else {
result = null;
}
} else if (v instanceof String) {
result = (String) v;
} else {
result = v.toString();
}
return result;
}
@Override
public String[] getParameterValues(String name) {
String[] result = null;
Object v=null;
if(params.containsKey(name)){
v = params.get(name);
}else{
v = super.getParameterValues(name);
}
if (v == null) {
result = null;
} else if (v instanceof String[]) {
result = (String[]) v;
} else if (v instanceof String) {
result = new String[] { (String) v };
} else {
result = new String[] { v.toString() };
}
return result;
}
}

在实施XSS防御时,通过HttpServletRequestWrapper过滤器修改请求参数导致jsp:param标签的值无法正常传递。当jsp:include中的另一个jsp试图获取参数时,值丢失。解决方案是调整过滤器逻辑,确保jsp:param的值能正确保留并传递。

415

被折叠的 条评论
为什么被折叠?



