【问题标题】:Restricting access to static files in Django/Nginx限制对 Django/Nginx 中的静态文件的访问
【发布时间】:2012-04-06 07:48:39
【问题描述】:

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

c7d43358-7532-4812-b828-b10b26694f0f.pdf

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

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

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

还有哪些其他解决方案?

【问题讨论】:

标签: django security nginx


【解决方案1】:

如果你在服务小文件,你确实可以使用 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 的身份验证框架执行用户身份验证应该非常简单。

【讨论】:

    【解决方案2】:

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

    例如您可以在视图上使用 @login_required decorator 以仅在登录时允许访问。这可以使用 request.user 来细化以检查文件的所有者。 Django documentation 的用户身份验证部分在这里可能会有所帮助。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-31
        • 2011-04-26
        • 2016-02-02
        • 1970-01-01
        • 2011-08-06
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多