2 IP封禁之临时与永久封禁策略

在网络爬虫的防护中,IP封禁是一种重要的反爬措施。前一篇文章中,我们讨论了基于IP的封禁规则,提到如何根据请求频率、请求类型等指标动态决定是否对某个IP实施封禁。在本篇文章中,我们将详细探讨两种具体的封禁策略:临时封禁和永久封禁。

临时封禁策略

临时封禁是一种短期限制,通常用于阻止某个IP在检测到异常行为后短时间内继续访问。这种策略能有效缓解突发的爬虫攻击,同时允许真正的用户在短时间内恢复访问。

何时使用临时封禁

临时封禁适用于以下场景:

  • 流量异常激增:当监测到某个IP地址的访问频率超过设定的阈值后,可以立即实施封禁。例如,一个IP在短短几分钟内发起了上千次请求。
  • 错误请求:反复发送404或500状态码请求的IP可以暂时封禁,以减少服务器负担。

实现临时封禁的案例

以下是一个使用Python和Flask实现临时IP封禁的简单例子:

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
from flask import Flask, request, jsonify
import time

app = Flask(__name__)

# 存储被封禁的IP和封禁时间
banned_ips = {}

@app.before_request
def check_ip():
client_ip = request.remote_addr
# 检查IP是否被封禁
if client_ip in banned_ips:
ban_time, duration = banned_ips[client_ip]
if time.time() < ban_time + duration:
return jsonify({"error": " Your IP is temporarily banned."}), 403
else:
del banned_ips[client_ip] # 解除封禁

@app.route('/some_endpoint')
def some_endpoint():
client_ip = request.remote_addr

# 假设检查频率,只是在演示
if is_suspicious_activity(client_ip):
banned_ips[client_ip] = (time.time(), 300) # 封禁5分钟
return jsonify({"error": "Too many requests, you are temporarily banned."}), 403

return jsonify({"message": "Success!"})

def is_suspicious_activity(ip):
# 这里定义你的检测逻辑
return True # 假设总是检测到可疑活动

if __name__ == '__main__':
app.run()

在上述代码示例中,我们在请求处理之前检查每个请求的IP是否被临时封禁。若发现该IP在设定的时间内进行了异常访问,则会给出相应的拒绝访问提示。

永久封禁策略

永久封禁是一种长期限制,通常用于处理恶意行为,例如大量抓取、故意攻击等。这种策略会导致某个IP在封禁后,无法再访问服务。

何时使用永久封禁

永久封禁可考虑以下情况:

  • 重复的恶意行为:某个IP在经过临时封禁后仍然继续进行恶意行为。
  • 严重的合规问题:例如,S正常流量后被分析出该IP涉及到大量的数据盗用。

实现永久封禁的案例

可以通过在数据库中添加一个黑名单表来实现永久封禁。以下是对之前代码的扩展:

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
import sqlite3

# 连接数据库
conn = sqlite3.connect('banned_ips.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS banned_ips (ip TEXT PRIMARY KEY, banned_time REAL)''')
conn.commit()

def check_permanent_ban(ip):
c.execute("SELECT * FROM banned_ips WHERE ip=?", (ip,))
return c.fetchone() is not None

def ban_permanently(ip):
c.execute("INSERT OR REPLACE INTO banned_ips (ip, banned_time) VALUES (?, ?)", (ip, time.time()))
conn.commit()

@app.before_request
def check_ip():
client_ip = request.remote_addr
# 检查永久封禁
if check_permanent_ban(client_ip):
return jsonify({"error": "Your IP is permanently banned."}), 403

if client_ip in banned_ips:
ban_time, duration = banned_ips[client_ip]
if time.time() < ban_time + duration:
return jsonify({"error": "Your IP is temporarily banned."}), 403
else:
del banned_ips[client_ip]

@app.route('/some_endpoint')
def some_endpoint():
client_ip = request.remote_addr

if is_suspicious_activity(client_ip):
# 如果是恶意行为,考虑永久封禁
ban_permanently(client_ip)
return jsonify({"error": "Your IP has been permanently banned due to malicious activity."}), 403

return jsonify({"message": "Success!"})

在这个扩展的示例中,我们使用SQLite作为数据库,在banned_ips表中记录永久封禁的IP。在检查请求时,除了临时封禁外,还要检查是否存在永久封禁的记录。

总结

临时与永久封禁是挫败网络爬虫和保障内容安全的两种有效手段。临时封禁可以短暂阻止可疑活动,而永久封禁则为处理恶意用户提供了更加严厉的手段。通过合理设置这两种策略及相应的规则,可以对抗不法的爬虫行为,并保障服务的正常运作。

接下来的文章中,我们将讨论如何管理IP的黑名单,确保封禁措施得以有效执行和更新。

2 IP封禁之临时与永久封禁策略

https://zglg.work/crawler-attack/2/

作者

IT教程网(郭震)

发布于

2024-08-11

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论