当前位置:   article > 正文

Servlet-Filter实现反爬虫

Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。

实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。
 */
package JRT.Core.Security;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 * 黑名单过滤器,实现拉黑
 */
public class BlackListFilter implements Filter {
    /**
     * 黑名单
     */
    public static HashMap<String, Long> BlackMap = new HashMap<>();

    /**
     * 访问这些url就拉黑
     */
    public static List<String> BlackUrl = new ArrayList<>();


    /**
     * 过滤器初始化
     *
     * @param filterConfig
     * @throws ServletException
     */
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * 执行筛选
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param chain    传递链
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //访问ip
        String ip = request.getRemoteAddr();
        HttpServletRequest httpReq = null;
        if (request instanceof HttpServletRequest) {
            httpReq = (HttpServletRequest) request;
        }
        //请求相对路径
        String url = httpReq.getRequestURI();
        if(BlackUrl.size()>0)
        {
            for(String one:BlackUrl)
            {
                if(url.contains(one))
                {
                    //拉黑
                    if(!BlackMap.containsKey(ip)) {
                        BlackMap.put(ip, System.currentTimeMillis());
                    }
                }
            }
        }
        //被来黑的处理
        if (BlackMap.containsKey(ip) && httpReq != null) {
            long starBlackTime = BlackMap.get(ip);
            long timeCha = (System.currentTimeMillis() - starBlackTime)/1000;
            // 使用当前时间的毫秒数作为Random的种子
            Random random = new Random((int) (System.currentTimeMillis() % Integer.MAX_VALUE));
            // 生成一个介于0(包括)和60(不包括)之间的随机整数
            int randomInt = random.nextInt(60);
            //20秒之后再开始拉黑,20-90秒之间随机不响应(随着时间和随机数推移20-90秒之前先大部分失败然后失败量减少,然后再失败增加到全失败)
            if ((timeCha > 20) && (timeCha + randomInt) > 90) {
                //判断内外网IP
                boolean isInnerIP = JRT.Core.Util.IPMacUtil.IsInnerIP(ip);
                //分钟
                long miniteCha = timeCha / 60;
                if (isInnerIP && miniteCha > (60 * 24)) {
                    BlackMap.remove(ip);
                } else if ((!isInnerIP) && miniteCha > 5) {
                    BlackMap.remove(ip);
                } else {
                    httpReq = (HttpServletRequest) request;
                    //定向到警告页面
                    if (httpReq.getRequestURI().contains("/error/SecurityWarning.html")) {
                        chain.doFilter(request, response);
                    } else {
                        HttpServletResponse httpResp = null;
                        if (response instanceof HttpServletResponse) {
                            httpResp = (HttpServletResponse) response;
                        }
                        httpResp.sendRedirect("../../error/SecurityWarning.html");
                    }
                    return;
                }

            }
        }
        chain.doFilter(request, response);
    }


    /**
     * 销毁方法
     */
    public void destroy() {
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125

把实现的Filter类配置到web.xml
在这里插入图片描述

实现警告页面
在这里插入图片描述

效果,被拉黑的IP所有资源请求都定位到警告页面,爬虫行为的识别由业务自己判断
在这里插入图片描述
这样就能对恶意访问进行拦截

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号