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