Django - 了解X-Sendfile

oro*_*aki 30 python django x-sendfile download protected-resource

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

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

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

  1. 我对X-Sendfile的解释至少是抽象的正确吗?
  2. 它是否真的安全,假设我没有提供正常的前端HTTP访问(例如http://www.example.com/downloads/secret-file.jpg)到文件存储的目录(即,不要不要把它保存在我的public_html目录中)?或者,精通技术的用户是否可以检查标题等,并以反向工程方式访问文件(然后分发)?
  3. 它在性能上是否真的有很大差异?我是否会通过直接从Django提供8b块150Mb文件的下载来使我的应用程序服务器陷入困境,或者这种类型是无问题的?我问的原因是因为如果两个版本接近相等,Django版本会更好,因为我有能力用Python做事,比如记录完成的下载次数,下载的带宽等.

提前致谢.

Jul*_*ian 23

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

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