HttpServletRequestWrapper和jsp:param之间的问题及XSS防御

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

为了防止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;
    }



}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值