限制访问Django / Nginx中的静态文件

时间:2012-03-21 18:25:21

标签: django security nginx

我正在构建一个允许用户生成文档然后下载它们的系统。这些文件是PDF(并不是为了这个问题而重要),当它们生成时,我将它们存储在我的本地文件系统上,运行web服务器并使用uuid文件名

c7d43358-7532-4812-b828-b10b26694f0f.pdf

但我知道“通过默默无闻的安全”不是正确的解决方案......

如果可能,我想基于每个帐户限制对这些文件的访问。我认为我可以做的一件事就是将它们上传到S3并提供一个签名的URL,但我想尽可能地避免这种情况。

我正在使用Nginx / Django / Gunicorn / EC2 / S3

还有哪些其他解决方案?

3 个答案:

答案 0 :(得分:10)

如果您要提供小文件,您确实可以使用Django直接提供它们,将文件写入HttpResponse对象。

但是,如果您要提供大型文件,您可能希望将该任务留给您的网络服务器,您可以使用Nginx上的X-Accel-Redirect标题(以及Apache和Lighttpd的X-Sendfile标题)您的网络服务器为您提供文件。

您可以找到有关标题本身in Nginx's documentation here的更多信息,您可以找到some inspiration as to how to use that in Django here

一旦你完成了通过Django视图发送文件,使用Django的auth框架执行用户身份验证应该是非常直接的。

答案 1 :(得分:3)

如何在视图级别强制执行user==owner,阻止访问文件,将其存储为FileFields,以及仅在满足条件时检索文件。

e.g。您可以使用视图上的@login_required decorator仅在登录时允许访问。可以使用request.user来改进以检查文件的所有者。 Django documentation的用户身份验证部分可能会对此有所帮助。

正如您所提到的另一个选项是通过S3本身,在Django中生成URL,其中包含一个查询字符串,允许经过身份验证的用户访问以下载具有时间限制的特定s3对象。有关详细信息,请访问s3 documentation。关于SO here之前已经提出过类似的问题。

答案 2 :(得分:2)

我已经使用django-private-files取得了巨大的成功,它在视图级别实施了保护,并使用不同的后端来进行实际的文件传输。