簡體   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