Django - 了解X-Sendfile

时间:2011-09-04 00:20:03

标签: python django download x-sendfile protected-resource

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

  1. 用户请求获取受保护文件的URI
  2. Django app根据URL决定返回哪个文件,并检查用户权限等
  3. Django app返回一个HTTP响应,其中'X-Sendfile'标头设置为服务器的文件路径
  4. Web服务器找到该文件并将其返回给请求者(我假设Web服务器也沿途删除了'X-Sendfile'标题)。
  5. 与直接从Django中删除文件相比,X-Sendfile似乎是一种更有效的方法来实现受保护的下载(因为我可以依赖Nginx来提供文件,而不是Django),但是给我留下了两个问题:< / p>

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

1 个答案:

答案 0 :(得分:22)

  1. 是的,这就是它的运作方式。
  2. 具体实施取决于网络服务器,但在nginx的情况下,建议将该位置标记为内部以防止外部访问。
  3. Nginx可以异步提供文件,而使用Django,每个请求需要一个线程,这对于更多的并行请求会有问题。
  4. 请记住为nginx而不是X-Sendfile发送X-Accel-Redirect标头。 有关详细信息,请参阅http://wiki.nginx.org/XSendfile