Исключение SuspiciousMultipartForm

Исключение SuspiciousMultipartForm является подклассом SuspiciousOperation и выбрасывается, когда Django обнаруживает подозрительное содержимое в multipart/form-data запросах. Это может произойти при попытке отправки слишком больших файлов, превышении лимитов полей формы или при обнаружении некорректной структуры multipart данных. Исключение помогает защитить приложение от потенциальных атак, связанных с переполнением памяти или DoS-атак через форму.

Синтаксис

pythonfrom django.core.exceptions import SuspiciousOperation
from django.http import SuspiciousMultipartForm

# Обработка исключения
try:
  # Код обработки формы
  pass
except SuspiciousMultipartForm as e:
  # Обработка ошибки
  pass

Пример

Рассмотрим пример, когда исключение может возникнуть при загрузке файла, превышающего лимиты размера:

pythonfrom django.http import SuspiciousMultipartForm
from django.shortcuts import render
from django.conf import settings

def upload_file(request):
  if request.method == 'POST':
    try:
      # Попытка обработать загруженный файл
      file = request.FILES['file']
      # Дополнительная логика обработки файла
      return render(request, 'success.html')
    except SuspiciousMultipartForm as e:
      # Логирование ошибки
      print(f"Suspicious form data: {e}")
      return render(request, 'error.html', {
        'error': 'File too large or invalid format'
      })
  return render(request, 'upload.html')

Пример

Пример обработки исключения при превышении лимита полей в форме:

pythonfrom django.http import SuspiciousMultipartForm
from django.core.exceptions import SuspiciousOperation
import logging

logger = logging.getLogger(__name__)

def process_form(request):
  if request.method == 'POST':
    try:
      # Обработка данных формы
      data = request.POST
      files = request.FILES
      
      # Проверка количества полей
      if len(data) > 100:
        raise SuspiciousMultipartForm("Too many fields in form")
        
      # Логика обработки
      print("Form processed successfully")
      
    except SuspiciousMultipartForm as e:
      logger.warning(f"Suspicious form detected: {e}")
      return None
  return True

Пример

Использование исключения в пользовательском middleware для глобальной обработки:

pythonfrom django.http import SuspiciousMultipartForm
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin

class SuspiciousFormMiddleware(MiddlewareMixin):
  def process_exception(self, request, exception):
    if isinstance(exception, SuspiciousMultipartForm):
      # Логирование подозрительного запроса
      print(f"Suspicious form from {request.META.get('REMOTE_ADDR')}")
      
      # Возврат JSON ответа с ошибкой
      return JsonResponse({
        'error': 'Invalid form data detected',
        'status': 400
      }, status=400)
    return None

Смотрите также

  • исключение SuspiciousOperation,
    базовое исключение для подозрительных операций
  • исключение RequestDataTooBig,
    возникает при превышении размера запроса
  • исключение TooManyFieldsSent,
    выбрасывается при превышении лимита полей
  • исключение TooManyFilesSent,
    возникает при превышении лимита файлов