基于黑名单的xss过滤器

/**
 * 类名称:AntiXssFilter   
 * @version
 * 类描述:基于黑名单的xss过滤器
 * @version   
 * 创建人:xxx
 * @version
 * 创建时间:2015年11月3日 下午1:00:11 
 * @version  
 * 修改人:xxx 修改时间:2015年11月3日 下午1:00:11 
 * @version
 * 修改备注:   
 */
public class AntiXssFilter implements Filter {

    public void destroy() {
    }

    @SuppressWarnings("unchecked")
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
        HttpServletRequest req = (HttpServletRequest) request;
        
        HttpServletResponse res = (HttpServletResponse) response;
        res.setContentType("application/json;charset=UTF-8");
        // 校验head参数
        if(existsXssHeadElement(req)) {
            ResponseUtils.toJson(res, IResponseCode.FAIL, "错误的参数");
//            res.sendError(404);
            return;
        }
        // 校验body参数    
        Map<String, String[]> parameterMap = req.getParameterMap();
        for (Object key : parameterMap.keySet()) {
            String[] val = (String[]) parameterMap.get(key);
            for (String v : val) {
                if(null != v){
                    v = URLDecoder.decode(URLDecoder.decode(v, "utf-8"),"utf-8");
                }
                if(existsXssElement(v)){
                    ResponseUtils.toJson(res, IResponseCode.FAIL, "错误的参数");
//                    res.sendError(404);
                    return;
                }
            }
        }
        chain.doFilter(request, response);
    }
    
    /**
     * @Title: existsXssHeadElement
     * @Description: 校验header中的参数
     * @return: boolean
     * @throws UnsupportedEncodingException 
     */
    private boolean existsXssHeadElement(HttpServletRequest req) throws UnsupportedEncodingException {
        // 设备号
        String deviceNo = req.getHeader("deviceNo");
        if(null != deviceNo){
            deviceNo = URLDecoder.decode(URLDecoder.decode(deviceNo, "utf-8"),"utf-8");
            if(existsXssElement(deviceNo)) {
                return true;
            }
        }
        // 终端
        String client = req.getHeader("client");
        if(null != client){
            client = URLDecoder.decode(URLDecoder.decode(client, "utf-8"),"utf-8");
            if(existsXssElement(client)) {
                return true;
            }
        }
        // 渠道
        String channel = req.getHeader("channel");
        if(null != channel){
            channel = URLDecoder.decode(URLDecoder.decode(channel, "utf-8"),"utf-8");
            if(existsXssElement(channel)) {
                return true;
            }
        }
        // app版本号
        String version = req.getHeader("version");
        if(null != version){
            version = URLDecoder.decode(URLDecoder.decode(version, "utf-8"),"utf-8");
            if(existsXssElement(version)) {
                return true;
            }
        }
        // app版本号序号
        String build = req.getHeader("build");
        if(null != build){
            build = URLDecoder.decode(URLDecoder.decode(build, "utf-8"),"utf-8");
            if(existsXssElement(build)) {
                return true;
            }
        }
        // ip
        String ip = req.getHeader("ip");
        if(null != ip){
            ip = URLDecoder.decode(URLDecoder.decode(ip, "utf-8"),"utf-8");
            if(existsXssElement(ip)) {
                return true;
            }
        }
        return false;
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
    
    /**
     * 黑名单
     * existsXssElement  
     * @param    
     * @return  
     * @throws 
     * @author zhuzheng
     * @date   2015年11月2日 下午1:12:16
     */
    private boolean existsXssElement(String s)
            throws UnsupportedEncodingException{
        boolean res = false;
        s = s.toLowerCase();
        res=getIncludeSqlSpecialCharsFlag(s);
        if(!res){
            res=getIncludeHtmlSpecialCharsFlag(s);
        }
        return res;
    }
    
    /**
     * 替换一些特殊字符
     * replaceSpecialChars  
     * @param    
     * @return  
     * @throws 
     * @author zhuzheng
     * @date   2015年11月2日 下午1:12:16
     */
    private String replaceSpecialChars(String s) throws UnsupportedEncodingException {
        String specialChar = "";
        s = s.replaceAll("(\r|\n|\t|\f|'|\")", "");
        s = s.replaceAll("(\r|\n|\t|\f|'|\")", "");
        int specialCharsLen = specailCharArray.length;
        for (int i = 0; i < specialCharsLen; i++) {
            specialChar = specailCharArray[i];
            specialChar = URLDecoder.decode(URLDecoder.decode(specialChar, "utf-8"), "utf-8");
            s = s.replaceAll(specialChar, "");
        }
        return s;
    }
    
    /**
     * 判断是否包含html特殊字符 
     * getIncludeHtmlSpecialCharsFlag  
     * @param    
     * @return  
     * @throws UnsupportedEncodingException 
     * @throws 
     * @author zhuzheng
     * @date   2015年11月2日 下午1:12:16
     */
    private boolean getIncludeHtmlSpecialCharsFlag(String s) throws UnsupportedEncodingException{
        boolean res = false;
//        s=replaceSpecialChars(s);
        if (    //XSS黑名单
                s.indexOf("javascript:") != -1 || s.indexOf("document.cookie") != -1
                || s.indexOf("<script") != -1 || s.indexOf("<iframe") != -1
                || s.indexOf("\"><script>") != -1 || s.indexOf("\"<script>") != -1
                || s.indexOf("<img") != -1 || s.indexOf("οnclick=") != -1
                || s.indexOf("<style") != -1 || s.indexOf(")//") != -1
                || s.indexOf("\">") != -1 || s.indexOf("<body") != -1
                || s.indexOf("/xss/") != -1 || s.indexOf("onfocus") != -1
                || s.indexOf("alert") != -1 //|| s.indexOf(";") != -1
                || s.indexOf("fromcharcode") != -1 || s.indexOf("eval") != -1
                || s.indexOf("<a") != -1 || s.indexOf("cookie") != -1
                || s.indexOf("document.write") != -1
            ) {
            ExceptionLogger.error("请求拦截可能存在SQL和脚本注入", "请求参数:"+ s , null);
            res = true;
        }
        return res;
    }
    /**
     * 判断是否包含sql特殊字符 
     * getIncludeSqlSpecialCharsFlag  
     * @param    
     * @return  
     * @throws 
     * @author zhuzheng
     * @date   2015年11月2日 下午1:12:16
     */
    private boolean getIncludeSqlSpecialCharsFlag(String s) {
        // 过滤掉的sql关键字,可以手动添加
        String badStr = "'|and |exec |execute |insert |select |delete |update |count|drop |chr|mid|master|truncate |"
                + "char|declare |sitename|net user|xp_cmdshell|or |like'%|like '%|insert |create |"
                + "table|from|grant|use|group_concat|column_name|"
                + "information_schema.columns|table_schema|union |where |order by |group by ";
        String[] badStrs = badStr.split("\\|");
        for (int i = 0; i < badStrs.length; i++) {
            if (s.indexOf(badStrs[i]) >= 0) {
                ExceptionLogger.error("请求拦截可能存在SQL和脚本注入", "请求参数:"+ s , null);
                return true;
            }
        }
        return false;
    }
    
    private String[] specailCharArray = { "%00", "%2B", "%25E3%2580%2580" };

}

转载于:https://www.cnblogs.com/dreammyle/p/5961209.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。 二、XSS漏洞的危害 (1)网络钓鱼,包括盗取各类用户账号; (2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作; (3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等; (4)强制弹出广告页面、刷流量等; (5)网页挂马; (6)进行恶意操作,例如任意篡改页面信息、删除文章等; (7)进行大量的客户端攻击,如DDoS攻击; (8)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等; (9)控制受害者机器向其他网站发起攻击; (10)结合其他漏洞,如CSRF漏洞,实施进一步作恶; (11)提升用户权限,包括进一步渗透网站; (12)传播跨站脚本蠕虫等; 三、过滤器配置 web.xml配置 XssFilter com.xxx.Filter.XssFilter XssFilter /*
在web.xml中配置XSS过滤器可以通过以下步骤完成: 1. 打开你的web.xml文件,该文件位于WEB-INF目录下。 2. 在web.xml文件中添加一个过滤器(Filter)的定义,如下所示: ```xml <filter> <filter-name>XssFilter</filter-name> <filter-class>com.example.XssFilter</filter-class> </filter> ``` 这里的`com.example.XssFilter`是你自己编写的XSS过滤器的类名,你需要根据自己的项目结构和需求来指定。 3. 在web.xml文件中添加一个过滤器映射(Filter Mapping),将过滤器与需要进行XSS过滤的URL模式进行关联,如下所示: ```xml <filter-mapping> <filter-name>XssFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这里的`/*`表示对所有的URL进行XSS过滤,你也可以根据需要指定具体的URL模式。 4. 编写XSS过滤器的代码。创建一个Java类,实现`javax.servlet.Filter`接口,然后在该类中进行XSS过滤的逻辑处理。以下是一个简单的示例: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class XssFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; // 获取请求参数,对参数进行XSS过滤处理 // ... // 继续执行后续的过滤器或Servlet filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { // 销毁操作 } } ``` 在`doFilter`方法中,你可以获取到请求参数,并对参数进行XSS过滤处理。具体的XSS过滤逻辑可以根据你的需求进行编写。 请注意,这只是一个简单的示例,实际的XSS过滤逻辑可能更为复杂,你需要结合具体的业务需求来进行实现。 完成以上步骤后,保存web.xml文件并重新部署你的Web应用程序,XSS过滤器将会对指定的URL进行XSS过滤处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值