Исключение SuspiciousFileOperation

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

Синтаксис

pythonfrom django.core.exceptions import SuspiciousFileOperation

# Исключение выбрасывается автоматически при небезопасных операциях
raise SuspiciousFileOperation("Message")

Пример

Рассмотрим попытку получить доступ к файлу за пределами медиа-директории:

pythonfrom django.core.files.storage import default_storage
from django.core.exceptions import SuspiciousFileOperation

try:
  # Попытка выйти за пределы разрешенной директории
  file_path = default_storage.path("../../etc/passwd")
  with open(file_path, 'r') as f:
    content = f.read()
except SuspiciousFileOperation as e:
  print("File operation blocked:", str(e))

Результат выполнения кода:

python"File operation blocked: The file path is suspicious"

Пример

Попытка сохранить файл с недопустимым именем:

pythonfrom django.core.files.base import ContentFile
from django.core.files.storage import default_storage
from django.core.exceptions import SuspiciousFileOperation
from myapp.models import Document

try:
  # Создание документа с потенциально опасным именем
  doc = Document.objects.create(
    title="test",
    file=ContentFile(b"content", "../../../secret.txt")
  )
except SuspiciousFileOperation as e:
  print("File save blocked:", str(e))

Результат выполнения кода:

python"File save blocked: Attempted access to 'secret.txt' outside of storage root"

Пример

Обработка исключения при удалении файла:

pythonfrom django.core.files.storage import default_storage
from django.core.exceptions import SuspiciousFileOperation

def safe_delete_file(file_path):
  try:
    if default_storage.exists(file_path):
      default_storage.delete(file_path)
      print("File deleted successfully")
  except SuspiciousFileOperation as e:
    print("Cannot delete file:", str(e))
  except Exception as e:
    print("Other error:", str(e))

# Попытка удалить файл с подозрительным путем
safe_delete_file("../../var/log/system.log")

Результат выполнения кода:

python"Cannot delete file: The file path is suspicious"

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

  • исключение SuspiciousOperation,
    базовое исключение для подозрительных операций
  • исключение DisallowedHost,
    возникающее при доступе с неразрешенного хоста
  • исключение DisallowedRedirect,
    возникающее при попытке редиректа на внешний URL
  • исключение SuspiciousFileOperation,
    подробная документация по файловым исключениям