繁体   English   中英

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

[英]Restricting access to static files in Django/Nginx

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

c7d43358-7532-4812-b828-b10b26694f0f.pdf

但我知道“模糊不清的安全性”不是正确的解决方案...

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

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

还有哪些其他解决方案?

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

但是,如果要提供大文件,则可能需要将该任务留给Web服务器,可以使用Nginx上的X-Accel-Redirect标头(对于Apache和Lighttpd,则使用X-Sendfile )使Web服务器为以下文件提供文件:您。

您可以在Nginx的文档中找到有关标头本身的更多信息,并在此处找到有关如何在Django中使用标头 一些启发

通过Django视图完成文件发送后,使用Django的auth框架强制执行用户身份验证应该很简单。

如何在视图级别强制执行user==owner ,如何防止访问文件,将它们存储为FileField,以及仅在满足该条件的情况下才检索文件。

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

正如您所提到的,另一个选择是通过S3本身,它在Django中生成带有查询字符串的URL,这些字符串允许经过身份验证的用户访问带有时间限制的特定S3对象。 有关详细信息,请参见s3文档 类似的问题已经被问过这里的SO。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM