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

jos*_*iti 6 security django nginx

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

c7d43358-7532-4812-b828-b10b26694f0f.pdf

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

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

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

还有什么其他解决方案?

Tho*_*zco 10

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

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

您可以在Nginx的文档中找到有关标题本身的更多信息,您可以在这里找到关于如何在Django中使用它的一些灵感.

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


jvc*_*c26 3

如何user==owner在视图级别强制执行,阻止访问文件,将它们存储为 FileFields,并且仅在满足该条件时才检索文件。

例如,您可以在视图上使用@login_required 装饰器,仅在登录时才允许访问。这可以通过request.user检查文件的所有者来完善。Django 文档的用户身份验证部分可能会有所帮助。

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