我用Django的中间件创建了一个防止网站攻击的处理方法

用以下的命令创建Django项目。

django-admin startproject MyObj01
cd MyObj01
python manage.py startapp App

以下是创建的文件结构文件。

MyObj01
├── App
│   ├── migrations
│   │   └── __init__.py
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── MyObj01
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

在MyObj01\App下新建一个urls.py文件

from django.urls import path
from App import views

urlpatterns = {
    path('home', views.home, name='home'),

}

在MyObj01\ MyObj01的urls.py文件中按照以下方式进行添加

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include(('App.urls', 'app'), namespace='app')),  # 追加
]

将以下内容添加到MyObj01\App中的views.py中。

from django.http import HttpResponse


def home(request):
    return HttpResponse('Home test')

在 MyObj01\App 的下面,创建一个新的文件名为 MyMiddle.py。

import time
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.core.cache import cache  # Djangoのキャッシュ機能


class AppMiddle(MiddlewareMixin):
    def process_request(self, request):
        black_ip_list = cache.get('black_ip_list', [])
        ip = request.META.get('REMOTE_ADDR')
        if ip in black_ip_list:
            return HttpResponse('使用中止')

        ip_time_list = cache.get(ip, [])
        time_temp = time.time()
        # 60秒前の更新記録を削除
        while ip_time_list and (time_temp - ip_time_list[-1]) > 60:
            ip_time_list.pop()
        ip_time_list.insert(0, time_temp)
        cache.set(ip, ip_time_list, timeout=60)
        if len(ip_time_list) > 20:
            black_ip_list.append(ip)
            # 該当IPで一週間内使用不可とする
            cache.set('black_ip_list', black_ip_list, timeout=60 * 60 * 24 * 7)
        if len(ip_time_list) > 10:
            return HttpResponse('頻繫に更新しないでください')

在MyObj01文件夹下的settings.py中添加如下内容

......

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App',  # 追加
]

MIDDLEWARE = [
    'App.MyMiddle.AppMiddle', # 追加 (一番最初に実行するように先頭に追加)
    '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',
]

......

启动服务器(python manage.py runserver 127.0.0.1:8000),若在60秒内超过10次更新「http://127.0.0.1:8000/app/home」,将显示“请勿频繁更新”页面,若在60秒内超过20次更新,则显示“已停止使用”页面。

广告
将在 10 秒后关闭
bannerAds