Как избежать возникновения SuspiciousFileOperation при загрузке фотографии в Django?
from django_resized import ResizedImageField
class UserProfilePhoto(Model):
photo = ResizedImageField(size=[128, 128], upload_to=MEDIA_ROOT)
photo_hash = BigIntegerField(
blank=True,
null=True,
help_text=_("an integer representation of the hexdigest hash of the photo"),
)
def __str__(self):
return f"{self.photo.name} ({self.photo_hash})"
Раньше у меня была операция save() в модели, которая выполняла изменение размера, но теперь я использую Django-resized, потому что после всех этих выяснений, как изменить размер фотографии и сгенерировать хэш-значение, оказалось, что для этого уже есть модуль.
Я добавляю фотографию в профиль пользователя (userprofilephoto) в админке.
SuspiciousFileOperation at /admin/userprofile/userprofilephoto/add/
Detected path traversal attempt in '/app/mine/media/mendlebrot-lawn.jpeg'
Как отключить ошибку или проверку?
Заранее отвечу на некоторые вопросы:
Нет. Я не собираюсь возвращаться к ImageField() Это дало мне ту же проблему с большим количеством кода.
Аргумент upload_to
предназначен для указания подкаталога или вызываемого файла, чтобы определить, где должны храниться загруженные файлы относительно MEDIA_ROOT
, а не абсолютного пути, как вы используете сейчас.
Проблема в том, что MEDIA_ROOT
- это абсолютный путь, указывающий на корень ваших медиафайлов, но upload_to
предназначен для обработки подпутей внутри MEDIA_ROOT
. Использование абсолютного пути в upload_to
может быть интерпретировано как попытка обхода пути.
Вам следует загрузить upload_to
, чтобы указать относительный каталог внутри MEDIA_ROOT
, а не использовать абсолютный MEDIA_ROOT
напрямую.
class UserProfilePhoto(Model):
....
photo = ResizedImageField(size=[128, 128],
upload_to="user_photos/")
....
Здесь upload_to="user_photos/"
указывает Django хранить загруженные изображения в подкаталоге user_photos
под каталогом MEDIA_ROOT
.