yej*_*xin 9 security django django-staticfiles
根据Django的文档:"将静态资产与用户上传的文件一起放在MEDIA_ROOT中是很常见的,并在MEDIA_URL上提供它们."
这是否意味着每个人都可以访问其他人上传的文件?这不安全吗?
对于不应公开的内容,这是一种潜在的轻率(我喜欢考虑每个用户上传的内容本质上不安全).
如果您担心用户上载内容的隐私,请禁用MEDIA_ROOT文件夹的Web服务器"自动索引".对于apache,它就像:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
<Location "/media/private-user-content/">
AuthType Basic
AuthName "Top Secret"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>
Run Code Online (Sandbox Code Playgroud)
没有索引,为了访问其他人文件,您必须猜测文件名.您可以使用FileFields的"upload_to"参数中的加密哈希来进行猜测.
<Directory /path/to/application/media/root>
Options -Indexes
</Directory>
Run Code Online (Sandbox Code Playgroud)
回答您的问题:是的,这将允许每个人访问每个人上传的文件。是的,这是一个安全风险。
作为一般规则,敏感文件永远不应该直接从文件系统提供。作为另一条规则,除非明确标记,否则所有文件都应被视为敏感文件。
MEDIA_ROOT和设置的起源MEDIA_URL可能在于 Django 作为发布平台的历史。毕竟,如果可以轻松找到他们添加到文章中的图片,您的编辑可能不会介意。但话又说回来,文章附带的图片通常是不敏感的。
扩展您的问题:敏感文件应始终放置在 Web 服务器无法直接访问的目录中。请求这些文件只能通过视图类或函数来完成,它们可以在提供文件之前进行一些合理的访问检查。
另外,不要依赖敏感文件的混淆。例如,让我们使用 Paulo 的示例(请参阅其他答案)来混淆相册。现在我的照片存储方式如下MEDIA_URL/A8FEB0993BED/P100001.JPG。如果我与其他人分享此链接,他们可以轻松尝试类似的 URL MEDIA_URL/A8FEB0993BED/P710032.JPG,基本上允许他们暴力破解我的整个相册。