可以在服务器端设定一个计数器,统计每个IP地址在一秒内的请求次数,若超过一个阈值,则判断为攻击行为,并拦截该IP地址。示例代码如下:
from collections import defaultdict
import time
MAX_REQS_PER_SECOND = 10
BLOCK_TIME = 60 # 封禁时间(秒)
BLOCK_THRESHOLD = 100 # 超过该请求数则封禁
blocklist = defaultdict(lambda: {'requests': 0, 'last_request': 0})
def is_blocked(ip):
if ip in blocklist:
last_req_time = blocklist[ip]['last_request']
if time.time() - last_req_time < BLOCK_TIME:
return True
else:
del blocklist[ip]
return False
def block(ip):
# 封禁指定IP地址
print(f"Blocking {ip}")
blocklist[ip]['block_time'] = time.time()
# 可以通过 iptables 规则或者应用层的封锁实现封禁
def request_handler(ip):
if is_blocked(ip):
return False
blocklist[ip]['requests'] += 1
blocklist[ip]['last_request'] = time.time()
if blocklist[ip]['requests'] > BLOCK_THRESHOLD:
block(ip)
return True
在请求处理的地方,调用 request_handler(ip)
函数判断是否需要封禁该IP地址。
上一篇:app更换域名服务器需要多久