上传 Django 照片时如何避免可疑文件操作?

问题描述 投票:0回答:1
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,因为在弄清楚如何调整照片大小并生成哈希值之后,结果发现有一个模块已经做到了。

我正在向管理员中的用户个人资料照片添加图片。

SuspiciousFileOperation at /admin/userprofile/userprofilephoto/add/
Detected path traversal attempt in '/app/mine/media/mendlebrot-lawn.jpeg'

如何关闭错误或验证?

提前回答一些问题:

不。我不会回到 ImageField() 它给了我同样的问题,但有更多的代码。

django django-models django-admin
1个回答
0
投票

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
的子目录中。

© www.soinside.com 2019 - 2024. All rights reserved.