java请求URL带参之防XSS攻击

1.web.xml新增filter配置

    <!-- URL请求参数字符过滤或合法性校验 -->
    <filter>
        <filter-name>XssFilter</filter-name>
        <filter-class>com.isoftstone.ifa.web.base.filter.XssFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>XssFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
filter

 

 2.新增com.isoftstone.ifa.web.base.filter.XssFilter     XssFilter.class类,(注:路径要正确)

package com.isoftstone.ifa.web.base.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {
    FilterConfig filterConfig = null;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //对请求进行拦截,防xss处理
        chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);        
    }

    @Override
    public void destroy() {
        this.filterConfig = null;
    }

}
XssFilter

3.新增XssHttpServletRequestWrapper拦截过滤class类

package com.isoftstone.ifa.web.base.filter;

import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private static final Logger logger = LoggerFactory
            .getLogger(XssHttpServletRequestWrapper.class);

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

    /**
     * 对数组参数进行特殊字符过滤
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values != null) {
            int length = values.length;
            String[] escapseValues = new String[length];
            for (int i = 0; i < length; i++) {
                escapseValues[i] = escapeHtml4(values[i]);
            }
            return escapseValues;
        }
        return super.getParameterValues(name);
    }

    @Override
    public String getQueryString() {
        return escapeHtml4(super.getQueryString());
    }

    /**
     * 对参数中特殊字符进行过滤
     */
    @Override
    public String getParameter(String name) {
        return escapeHtml4(super.getParameter(name));
    }

    /**
     * 对请求头部进行特殊字符过滤
     */
    @Override
    public String getHeader(String name) {
        return escapeHtml4(super.getHeader(name));
    }

    public static String escapeHtml4(String value) {
        if (StringUtils.isNotBlank(value)) {
             // 避免script 标签 
             Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免src形式的表达式 
             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 删除单个的 </script> 标签 
             scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 删除单个的<script ...> 标签 
             scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 eval(...) 形式表达式 
             scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 e­xpression(...) 表达式 
             scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 javascript: 表达式 
             scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 vbscript:表达式 
             scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 onload= 表达式 
             scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 onmouseover= 表达式 
             scriptPattern = Pattern.compile("onmouseover(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             // 避免 onfocus= 表达式 
             scriptPattern = Pattern.compile("onfocus(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll("");
             // 避免 onerror= 表达式 
             scriptPattern = Pattern.compile("onerror(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
             value = scriptPattern.matcher(value).replaceAll(""); 
             
            //移除特殊标签
            value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
        }
        return value;
    }
    
    public static void main(String[] args) {
        String value = "&receiveCellphone=13888888888&receiveEmail=ssssss%40qq.com\"/><img/src=1 onclick=alert(document.cookie)>&";
        System.out.println("===:"+escapeHtml4(value));
    }
}
XssHttpServletRequestWrapper

 

posted @ 2018-12-26 11:10  超神之巅  阅读(3848)  评论(0编辑  收藏  举报