赞
踩
以前用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() { } }
把实现的Filter类配置到web.xml
实现警告页面
效果,被拉黑的IP所有资源请求都定位到警告页面,爬虫行为的识别由业务自己判断
这样就能对恶意访问进行拦截
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。