将django media_url暴露给每个人并不安全吗?

时间:2012-09-07 03:56:44

标签: django security django-staticfiles

根据Django文档:“将静态资产与用户上传的文件一起放在MEDIA_ROOT中是常见的,并在MEDIA_URL上提供它们。”

这是否意味着每个人都可以访问其他人上传的文件? 不是不安全吗?

2 个答案:

答案 0 :(得分:5)

对于不应公开的内容,这是一种潜在的轻率(我喜欢考虑每个用户上传的内容本质上不安全)。

如果您担心用户上传内容的隐私,请禁用MEDIA_ROOT文件夹的Web服务器“自动索引”。对于apache,它就像:

<Directory /path/to/application/media/root>
   Options -Indexes
</Directory>

如果没有索引,为了访问其他人文件,您必须猜测文件名。您可以使用FileFields的“upload_to”参数中的加密哈希来进行猜测。

def hard_to_guess(instance, filename):
    salt = 'six random words for hidden salt'
    hash =  hashlib.md5(instance.user.username + salt)
    return '/'.join(['content', hash, filename])

...

class SomeModel(models.Model):
    ...
    user = models.ForeignKey(User)        
    content = models.FileField(upload_to=hard_to_guess)
    ...

答案 1 :(得分:3)

回答你的问题:是的,这将允许每个人访问每个人的上传文件。是的,这是一个安全风险。

作为一般规则,永远不应直接从文件系统提供敏感文件。另一个规则是,除非另有明确说明,否则应将所有文件视为敏感文件

MEDIA_ROOTMEDIA_URL设置的起源可能在于Django作为发布平台的历史。毕竟,您的编辑可能不会介意他们添加到文章中的图片是否很容易找到。但话说回来,伴随文章的图片通常是不敏感的。

要扩展您的问题:敏感文件应始终放在Web服务器无法直接访问的目录中。请求这些文件只能通过视图类或函数完成,它可以在提供文件之前进行一些合理的访问检查。

此外,不要依赖于敏感文件的混淆。例如,让我们使用Paulo的示例(请参阅其他答案)来混淆相册。现在我的照片存储为MEDIA_URL/A8FEB0993BED/P100001.JPG。如果我与其他人分享此链接,他们可以轻松尝试MEDIA_URL/A8FEB0993BED/P710032.JPG这样的网址,基本上允许他们对我的整个相册进行暴力破解。