簡體   English   中英

我可以使用Django來阻止直接訪問圖像文件嗎?

[英]Can I use Django to prevent direct access to an image file?

我想阻止我的網絡用戶只是右鍵單擊圖像並復制/共享URL。 某些經過身份驗證的用戶可以訪問某些圖像,我希望盡可能強制執行此操作。 未經過身份驗證的用戶應該無法訪問圖像文件。

由於性能問題,我們通常建議避免從數據庫中存儲/獲取圖像。

我考慮過有一個函數讀取文件(服務器端,在python中)並將其插入到Django視圖函數中的網頁(base64編碼,可能或其他方式)中。 結合拒絕外部請求的.htaccess文件,這可能會有效,但似乎它是資源密集型的。

是否還有其他選項來強制執行此規則? 我意識到用戶可以截圖,保存圖像等,但我有責任盡可能強制執行這些限制,我最好的選擇是什么?

編輯:我沒有使用CDN的經驗,但如果它是一個涵蓋這些需求的可行選項,他們願意使用它。

我會咬人的。

會話中間件 - 不優雅,但它會工作

您希望通過標准的apache / django靜態文件配置無法提供您不希望公開提供的圖像。

您的會話中間件然后可以檢查路徑的所有傳入請求,如果路徑是您的圖像目錄(例如/ privateimg /)並且用戶未經過身份驗證,您可以將它們退回或將其替換為另一個圖像(例如一個)有水印的)。

您可以查看關於會話中間件如何工作的django文檔https://docs.djangoproject.com/en/dev/topics/http/sessions/

人們仍然可以傳遞您的鏈接,但只有經過身份驗證的用戶才能真正看到所述鏈接的內容(稱為門控您的內容)

詳細說明:

settings.py

GATED_CONTENT = (
    '/some_content_dir/', # This is a directory we want to gate
    '.pdf', # maybe we want to gate an entire content type
)

MIDDLEWARE_CLASSES = (
    ...  # Out of the box middleware...blah blah
    'yourapp.somemodule.sessionmiddleware.GatedContent',
)

然后你有以下的應用程序結構

yourapp
   |-somemodule
        |-sessionmiddleware.py

現在到了肉(百勝!)

sessionmiddleware.py

class GatedContent(object):
"""
Prevents specific content directories and types 
from being exposed to non-authenticated users
"""

def process_request(self, request):
   path = request.path
   user = request.user # out of the box auth, YMMV

   is_gated = False
   for gated in settings.GATED_CONTENT:
      if path.startswith(gated) or path.endswith(gated):
          is_gated = True
          break
  # Validate the user is an authenticated/valid user
  if is_gated and not user.is_authenticated():
      # Handle redirect

您可能對XSendfile感興趣。

這是IMO的最優雅和性能選擇:實際文件將由您的網絡服務器提供,而對這些文件的訪問控制將使用您的Django應用程序完成。

你可以谷歌搜索“django xsendfile”,有很多有用的帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM