Advertisement
klyman047

DDoS, Fuerza Bruta middleware

Mar 24th, 2024
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.76 KB | Source Code | 0 0
  1. # En el archivo middlewares.py de tu aplicacion
  2. from rest_framework.status import HTTP_200_OK, HTTP_403_FORBIDDEN
  3. from django.http import HttpResponseForbidden
  4. from django.core.cache import cache
  5. from django.conf import settings
  6.  
  7. import settings # importar las opciones del proyecto
  8.  
  9.  
  10. class DDoSProtectionMiddleware:
  11.     def __init__(self, get_response):
  12.         self.get_response = get_response
  13.         self.time_window = 60
  14.  
  15.     def process_request(self, request):
  16.         ip_address = request.META.get('REMOTE_ADDR')
  17.         cache_key = f"DDoS_{ip_address}"
  18.  
  19.         request_count = cache.get(cache_key, 0)
  20.         request_count += 1
  21.  
  22.         if request_count > settings.REQUESTS_PER_MINUTE_ALLOWED:
  23.             return HttpResponseForbidden("Demasiadas solicitudes.", status=HTTP_403_FORBIDDEN)
  24.  
  25.         cache.set(cache_key, request_count, timeout=self.time_window)
  26.  
  27.         return None
  28.  
  29.     def __call__(self, request):
  30.         return self.process_request(request) or self.get_response(request)
  31.  
  32.  
  33. class BruteForceProtectionMiddleware:
  34.     def __init__(self, get_response):
  35.         self.get_response = get_response
  36.  
  37.     def __call__(self, request):
  38.         response = self.get_response(request)
  39.         print(response)
  40.  
  41.         # revisa si la solicitud es del endpoint para login
  42.         if request.path in '/api/auth/token/' and request.method == 'POST': # cambia la url para la que uses para el login
  43.             ip_address = request.META.get('REMOTE_ADDR')
  44.  
  45.             cache_key = f"Intento_de_login_de_{ip_address}"
  46.             login_attempts = cache.get(cache_key, 0)
  47.  
  48.             if response.status_code != HTTP_200_OK:
  49.                 cache.set(cache_key, login_attempts + 1, timeout=settings.BRUTE_FORCE_TIMEOUT)
  50.                 print(f"Intentos de login: {login_attempts + 1}")
  51.             else:
  52.                 cache.delete(cache_key)
  53.                 print("Login exitoso")
  54.  
  55.             if login_attempts >= core.settings.BRUTE_FORCE_THRESHOLD:
  56.                 print(f"Excedidos los intentos de login, espere {settings.BRUTE_FORCE_TIMEOUT} segundos.")
  57.                 return HttpResponseForbidden(
  58.                     f"Excedidos los intentos de login, espere {settings.BRUTE_FORCE_TIMEOUT} segundos."
  59.                 )
  60.  
  61.         return response
  62.  
  63. #! En el archivo settings.py de tu aplicacion debes poner las siguientes constantes (se llaman asi pq quise, les puedes cambiar el nombre a lo que quieras en la vida real)
  64. #! Copia estas constantes para el lugar que quieras, y las cambias segun desees
  65. # ....
  66. BRUTE_FORCE_THRESHOLD = 6  # Intentos de login permitidos (6)
  67. BRUTE_FORCE_TIMEOUT = 60  # Tiempo de espera para intentar login nuevamente (60 segundos)
  68.  
  69. REQUESTS_PER_MINUTE_ALLOWED = 500  # Número de solicitudes permitidas por minuto
  70. # .....
Tags: django
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement