Nginx黑名单与Django中间件:应对CC攻击的轻量级方案

Miles
Miles
发布时间:2026-10-13 | 4人浏览过
原创

本文针对Django项目遭遇CC攻击导致服务器CPU满载的问题,提供两种简单有效的防御策略。首先介绍通过Nginx配置文件设置IP黑名单以在接入层拦截恶意请求;其次展示如何在Django中编写自定义Middleware,基于Session实现简单的请求频率限制。这两种方法代码量少、部署快,能有效缓解高并发恶意请求对后端应用的冲击。

CC攻击下的服务器异常与排查

当Django项目遭遇CC攻击时,无需过度紧张,本文推荐两种简单且实用的应对技巧。

通常项目架构中,Nginx作为HTTP接入层负责分发请求至Django应用,后端启动10个uwsgi worker进程处理业务。

若突然发现网页打开严重卡顿,检查服务器状态会发现CPU使用率飙升至100%。

查看uwsgi日志后,往往能发现某个特定IP发起了大量请求,占用了所有worker资源。

针对此类情况,主要总结两种解决思路:

Nginx接入层黑名单配置

第一种方法是配置Nginx黑名单。

首先使用vi命令创建blockip.conf文件,并在其中输入需要封禁的IP地址。


deny x.x.x.x; 

接着编辑nginx.conf主配置文件,在http{}配置块内添加对该黑名单文件的引用。


include blockip.conf;

配置完成后,需验证Nginx配置语法是否正确。


[root@server nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

确认无误后,执行命令重启Nginx服务使配置生效。


nginx -s reload

Django应用层中间件限速实现

第二种方法是在Django应用内部添加自定义中间件。

新建RequestBlockingMiddleware.py文件,实现具体的拦截逻辑。


import time
from django.core.exceptions import PermissionDenied
 
from django.utils.deprecation import MiddlewareMixin
MAX_REQUEST_PER_SECOND=2 #每秒访问次数
class RequestBlockingMiddleware(MiddlewareMixin):
  def process_request(self,request):
     now=time.time()
     request_queue = request.session.get('request_queue',[])
     if len(request_queue) < MAX_REQUEST_PER_SECOND:
       request_queue.append(now)
       request.session['request_queue']=request_queue
     else:
       time0=request_queue[0]
     if (now-time0)<1:
       raise PermissionDenied('Forbidden user agent')
     request_queue.append(time.time())
     request.session['request_queue']=request_queue[1:]

最后在setting.py配置文件中注册该中间件,确保其按顺序加载。


MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'common.middleware.RequestBlockingMiddleware', #在sessions之后,auth之前
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

该中间件代码不足100行,部署后日志中不再出现恶意IP的请求记录,攻击者可能正对着被禁用的页面感到沮丧。

以上关于Nginx黑名单与Django限速的防恶意请求方法分享完毕,希望能为读者提供参考,欢迎支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表