以前用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 {//访问ipString 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) {//判断内外网IPboolean 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所有资源请求都定位到警告页面,爬虫行为的识别由业务自己判断
这样就能对恶意访问进行拦截