服务端防止大规模的恶意请求

模拟一个客户端恶意请求服务器,如果在1分钟内请求了1000次,就将这个客户端的ip给禁了!

我们在middleswares.py文件下自定义一个中间件:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
import datetime

#模存入用户ip的访问情况
HISTORY = {}
# 模拟存放被禁的ip名单数据表
BLACK_LIST=[]


class Throttle(MiddlewareMixin):
    def process_request(self, request):
        #拿到当前访问的时间
        now = datetime.datetime.now()
        # 拿到访问者的ip
        ip = request.META.get("REMOTE_ADDR")
        #判断此ip有没有被记录在黑名单如,如果有不让它继续访问
        if ip in BLACK_LIST:
            return HttpResponse('你的ip已经被禁了!')
        # 判断一下当前ip有没有访问的histroy,如果没有就给它添加一个记录
        if ip not in HISTORY:
            HISTORY[ip] = {'last': now, 'times': 0}
        # 做访问次数的逻辑判断,在1分钟内次数加1
        if (now - HISTORY[ip]['last']) < datetime.timedelta(seconds=60):
            HISTORY[ip]['times'] += 1
        else:
            # 超过一分钟就清空之前的记录,重新计算
            HISTORY[ip]['times'] = 0
            HISTORY[ip]['last'] = now
        # 判断如果它的在一分钟之内,请求了1000次,将它的ip加入到黑名单内
        if HISTORY[ip]['times'] > 1000:
            BLACK_LIST.append(ip)
            return HttpResponse('你的ip已经被禁了!')

将这个自定义的中间件配置上:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleswares.Throttle',
]

运行效果:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值