根据Django文档:“将静态资产与用户上传的文件一起放在MEDIA_ROOT中是常见的,并在MEDIA_URL上提供它们。”
这是否意味着每个人都可以访问其他人上传的文件? 不是不安全吗?
答案 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_ROOT
和MEDIA_URL
设置的起源可能在于Django作为发布平台的历史。毕竟,您的编辑可能不会介意他们添加到文章中的图片是否很容易找到。但话说回来,伴随文章的图片通常是不敏感的。
要扩展您的问题:敏感文件应始终放在Web服务器无法直接访问的目录中。请求这些文件只能通过视图类或函数完成,它可以在提供文件之前进行一些合理的访问检查。
此外,不要依赖于敏感文件的混淆。例如,让我们使用Paulo的示例(请参阅其他答案)来混淆相册。现在我的照片存储为MEDIA_URL/A8FEB0993BED/P100001.JPG
。如果我与其他人分享此链接,他们可以轻松尝试MEDIA_URL/A8FEB0993BED/P710032.JPG
这样的网址,基本上允许他们对我的整个相册进行暴力破解。