Исключение SuspiciousFileOperation
Исключение SuspiciousFileOperation наследуется от SuspiciousOperation и возникает, когда Django обнаруживает попытку выполнить потенциально небезопасную операцию с файлом. Это исключение выбрасывается при работе с файловыми полями, хранилищами и операциях записи/чтения файлов, когда путь к файлу содержит попытки выхода за пределы разрешенных директорий или использует недопустимые символы. Основная цель исключения - защитить файловую систему от атак типа Directory Traversal.
Синтаксис
from django.core.exceptions import SuspiciousFileOperation
# Исключение выбрасывается автоматически при небезопасных операциях
raise SuspiciousFileOperation("Message")
Пример
Рассмотрим попытку получить доступ к файлу за пределами медиа-директории:
from 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))
Результат выполнения кода:
"File operation blocked: The file path is suspicious"
Пример
Попытка сохранить файл с недопустимым именем:
from 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))
Результат выполнения кода:
"File save blocked: Attempted access to 'secret.txt' outside of storage root"
Пример
Обработка исключения при удалении файла:
from 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")
Результат выполнения кода:
"Cannot delete file: The file path is suspicious"
Смотрите также
-
исключение
SuspiciousOperation,
базовое исключение для подозрительных операций -
исключение
DisallowedHost,
возникающее при доступе с неразрешенного хоста -
исключение
DisallowedRedirect,
возникающее при попытке редиректа на внешний URL -
исключение
SuspiciousFileOperation,
подробная документация по файловым исключениям