Django-了解X-Sendfi

2024-05-12 16:17:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 用户请求URI以获取受保护的文件
  2. Django应用程序根据URL决定返回哪个文件,并检查用户权限等
  3. Django app返回一个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做一些事情,比如记录已完成下载的数量、记录下载的带宽等等

提前谢谢。


Tags: 文件django方法用户版本服务器目录web
1条回答
网友
1楼 · 发布于 2024-05-12 16:17:30
  1. 是的,就是这样。
  2. 具体实现取决于web服务器,但对于nginx,建议将位置标记为内部,以防止外部访问。
  3. Nginx可以异步地为文件服务,而使用Django时,每个请求需要一个线程,这对于更多的并行请求可能会产生问题。

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

相关问题 更多 >