Джанго-админ защита сил британцев и многое другое

Я знаю, что это хорошо освещенная тема на SO, но может кто-нибудь сказать мне, есть ли какой-нибудь сторонний пакет на django-admin защита, которая поддерживает django версия 1.8 + и python 3.4+. Кажется, все, что я нашел, устарело и поддерживает <1,7 django версия и питон 2.7.

Более того, может ли кто-нибудь объяснить, как я могу вручную защитить django-admin, что будет предпринято при написании кода для защиты django-admin от атак методом перебора?

1 ответ

Я использую два метода:

Бэкэнд аутентификации кэширует последнюю попытку входа в систему и отклоняет слишком частые попытки.

from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.backends import ModelBackend
from django.core.cache import cache
import datetime

class BruteForceProtectedAuthBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        now = datetime.datetime.now()
        last_login = cache.get(username + '-login-attempt', now - datetime.timedelta(days=1))
        cache.set(username + '-login-attempt', now)
        if (now - last_login) < datetime.timedelta(seconds=settings.AUTH_RATE):
            return None

        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
            else:
                return None
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

Промежуточное программное обеспечение отклоняет запрос к административным URL-адресам с нелокальных IP-адресов.

from django.http import HttpResponseForbidden
from django.conf import settings
from ipware.ip import get_ip

class ProtectAdminSiteMiddleware(object):
    def process_request(self, request):
        if request.path.startswith(reverse('admin:index')):
            remote_addr = get_ip(request)
            if remote_addr is None:
                return HttpResponseForbidden('Forbiden')
            else:
                if not remote_addr in settings.INTERNAL_IPS:
                    return HttpResponseForbidden('Forbiden')
        return None
Другие вопросы по тегам