jfinal xss过滤以及url注入漏洞的问题

这里参考jfinal社区的xss处理方式这里简单记录一下。
1.首先:创建XssHandler 代码如下:

package com.gdszgl.common.handler;
import com.jfinal.handler.Handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jsoup.helper.StringUtil;

import java.util.Date;
import java.util.regex.Pattern;

/**
 * 全局xss过滤
 * @author ren
 * @date 创建时间:2017年5月18日 下午1:45:37
 */
public class XssHandler extends Handler {

    // 排除的url,使用的target.startsWith匹配的
    private String excludePattern;

    /**
     * 忽略列表,使用正则
     * @param excludePattern
     */
    public XssHandler(String excludePattern) {
        System.out.println("进入xss拦截------------------------------"+new Date());
        this.excludePattern = excludePattern;
    }

    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {

        java.util.regex.Pattern pattern = Pattern.compile(excludePattern);
        //带.表示非action请求,忽略(其实不太严谨,如果是伪静态,比如.html会被错误地排除);匹配excludePattern的,忽略
        if (target.indexOf(".") == -1 && !(!StringUtil.isBlank(excludePattern) && pattern.matcher(target).find() ) ){
            request = new XssHttpServletRequestWrapper(request);
        }
        //别忘了
        next.handle(target, request, response, isHandled);

    }

}

2.重写 HttpServletRequestWrapper用于配合XssHandler

package com.gdszgl.common.handler;

import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;

import javax.servlet.http.HttpServletRequest;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.HashMap;
import java.util.Map;

/**
 * 重写HttpServletRequestWrapper用于配合XssHandler
 * @author ren
 * @date 创建时间:2017年5月18日 下午1:49:26
 */
public class XssHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper{

    public XssHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    /**
     * 重写并过滤getParameter方法
     */
    @Override
    public String getParameter(String name) {
        return getBasicHtmlandimage(super.getParameter(name));

    }

    /**
     * 重写并过滤getParameterValues方法
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (null == values){
            return null;
        }
        for (int i = 0; i < values.length; i++) {
            values[i] = getBasicHtmlandimage(values[i]);
        }
        return values;
    }

    /**
     * 重写并过滤getParameterMap方法
     */
    @Override
    public Map getParameterMap() {
        @SuppressWarnings("unchecked")
        Map paraMap = super.getParameterMap();
        // 对于paraMap为空的直接return
        if (null == paraMap || paraMap.isEmpty()) {
            return paraMap;
        }

        //super.getParameterMap()不允许任何修改,所以只能做深拷贝
        Map paraMapCopy = new HashMap();
        //实际上putAll只对基本类型深拷贝有效,如果是自定义类型,则要找其他办法
        paraMapCopy.putAll(paraMap);

        for (Map.Entry entry : paraMapCopy.entrySet()) {
            String[] values     = entry.getValue();
            if (null == values) {
                continue;
            }
            String[] newValues  = new String[values.length];
            for (int i = 0; i < values.length; i++) {
                newValues[i] = getBasicHtmlandimage(values[i]);
            }
            entry.setValue(newValues);
        }
        return paraMapCopy;
    }

    private static String getBasicHtmlandimage(String html) {
        if (html == null)
            return null;

        html=Jsoup.clean(html, Whitelist.basicWithImages());
        //再次过滤
        return  html;
    }


   
}

3.最后在 _MainConfig 启动类中把handler 注册进去。

public void configHandler(Handlers me) {
    //添加xss 过滤(正则表达式:"/((\\%3C)|<)((\\%2F)|\\/)*[a-z0-9\\%]+((\\%3E)|>)/ix")
    me.add(new XssHandler("/((\\%3C)|<)((\\%2F)|\\/)*[a-z0-9\\%]+((\\%3E)|>)/ix"));
  }

ok ,完成。

你可能感兴趣的:(java)