Django项目是否有中间件可检测阻止URL遍历及限制请求频次?
Django 阻止URL PK遍历的防护方案
当然有办法解决这类PK遍历问题,无论是自定义中间件还是现成工具都能实现特定时间窗口内的请求次数限制,以下是具体方案:
一、自定义速率限制中间件
你可以自己实现一个中间件,针对包含<pk>的目标URL路径,跟踪每个客户端IP的请求频率:
中间件代码示例
from django.core.cache import cache from django.http import HttpResponseTooManyRequests class PKRateLimitMiddleware: def __init__(self, get_response): self.get_response = get_response # 可根据需求调整配置 self.target_path_prefix = "/myapp/" self.max_requests = 10 # 时间窗口内允许的最大请求数 self.time_window = 60 # 时间窗口(秒) def __call__(self, request): # 仅对目标路径的请求做限制 if request.path.startswith(self.target_path_prefix): client_ip = self._get_real_client_ip(request) cache_key = f"pk_rate_limit:{client_ip}:myapp" current_count = cache.get(cache_key, 0) if current_count >= self.max_requests: return HttpResponseTooManyRequests("请求过于频繁,请稍后重试。") # 更新缓存计数 if current_count == 0: cache.set(cache_key, 1, self.time_window) else: cache.incr(cache_key) response = self.get_response(request) return response def _get_real_client_ip(self, request): # 处理反向代理场景下的真实IP获取 x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded_for: return x_forwarded_for.split(",")[0].strip() return request.META.get("REMOTE_ADDR")
注册中间件
在项目的settings.py的MIDDLEWARE列表中添加中间件路径:
MIDDLEWARE = [ # 其他中间件... "myproject.middleware.PKRateLimitMiddleware", ]
二、使用第三方库快速实现
推荐用django-ratelimit这个成熟的库,无需自己从头写逻辑:
视图级限制示例
给目标视图添加装饰器,限制每个IP每分钟最多10次请求:
from ratelimit.decorators import ratelimit @ratelimit(key="ip", rate="10/m", method="GET", block=True) def myapp_detail(request, pk): # 你的视图逻辑 ...
也可以通过配置中间件,对特定URL路径批量设置速率限制,具体可参考库的配置逻辑。
三、额外强化防护的建议
- 替换自增PK:把数据库主键从自增整数改成UUID或随机字符串,让遍历行为失去意义
- 添加权限验证:敏感接口仅允许登录用户访问,减少匿名遍历的可能
- 人机验证:对触发速率限制的IP,要求完成验证码验证后才能继续访问
- 日志与黑名单:记录异常请求日志,定期分析高频IP,加入系统黑名单
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

