38

我一直在使用 Django 对具有访问控制的文件下载进行一些研究。我的目标是完全阻止对文件的访问,除非由特定用户访问。我读过在使用 Django 时,X-Sendfile 是实现这一目标的选择方法之一(基于其他 SO 问题等)。我对在 Django 中使用 X-Sendfile 的基本理解是:

  1. 用户请求 URI 以获取受保护的文件
  2. Django 应用程序根据 URL 决定返回哪个文件,并检查用户权限等。
  3. Django 应用程序返回一个 HTTP 响应,并将“X-Sendfile”标头设置为服务器的文件路径
  4. Web 服务器找到该文件并将其返回给请求者(我假设 Web 服务器还删除了“X-Sendfile”标头)

与直接从 Django 中获取文件相比,X-Sendfile 似乎是实现受保护下载的更有效方法(因为我可以依赖 Nginx 来提供文件,而不是 Django),但给我留下了 2 个问题:

  1. 我对 X-Sendfile 的解释至少在抽象上是正确的吗?
  2. 它真的安全吗,假设我不提供正常的前端 HTTP 访问(例如http://www.example.com/downloads/secret-file.jpg)到存储文件的目录(即, '不要把它放在我的public_html目录中)?或者,精通技术的用户是否可以检查标题等并逆向工程访问文件(然后分发)的方式?
  3. 是不是性能真的相差很大。我会通过直接从 Django 提供 150Mb 文件的 8b 块下载来使我的应用程序服务器陷入瘫痪,还是这种非问题?我问的原因是因为如果两个版本几乎相等,那么 Django 版本会更可取,因为我能够在 Python 中执行操作,例如记录已完成下载的数量、下载的统计带宽等。

提前致谢。

4

1 回答 1

26
  1. 是的,这就是它的工作原理。
  2. 确切的实现取决于网络服务器,但在 nginx 的情况下,建议将位置标记为内部以防止外部访问。
  3. Nginx 可以异步提供文件,而使用 Django,每个请求需要一个线程,这对于更多数量的并行请求可能会产生问题。

请记住为 nginx 发送 X-Accel-Redirect 标头而不是 X-Sendfile。有关详细信息,请参阅http://wiki.nginx.org/XSendfile

于 2011-09-04T03:47:43.930 回答