我一直在使用 Django 对具有访问控制的文件下载进行一些研究。我的目标是完全阻止对文件的访问,除非由特定用户访问。我读过在使用 Django 时,X-Sendfile 是实现这一目标的选择方法之一(基于其他 SO 问题等)。我对在 Django 中使用 X-Sendfile 的基本理解是:
- 用户请求 URI 以获取受保护的文件
- Django 应用程序根据 URL 决定返回哪个文件,并检查用户权限等。
- Django 应用程序返回一个 HTTP 响应,并将“X-Sendfile”标头设置为服务器的文件路径
- Web 服务器找到该文件并将其返回给请求者(我假设 Web 服务器还删除了“X-Sendfile”标头)
与直接从 Django 中获取文件相比,X-Sendfile 似乎是实现受保护下载的更有效方法(因为我可以依赖 Nginx 来提供文件,而不是 Django),但给我留下了 2 个问题:
- 我对 X-Sendfile 的解释至少在抽象上是正确的吗?
- 它真的安全吗,假设我不提供正常的前端 HTTP 访问(例如http://www.example.com/downloads/secret-file.jpg)到存储文件的目录(即, '不要把它放在我的
public_html
目录中)?或者,精通技术的用户是否可以检查标题等并逆向工程访问文件(然后分发)的方式? - 是不是性能真的相差很大。我会通过直接从 Django 提供 150Mb 文件的 8b 块下载来使我的应用程序服务器陷入瘫痪,还是这种非问题?我问的原因是因为如果两个版本几乎相等,那么 Django 版本会更可取,因为我能够在 Python 中执行操作,例如记录已完成下载的数量、下载的统计带宽等。
提前致谢。