Как избежать возникновения 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.

Вернуться на верх