[英]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/
人們仍然可以傳遞您的鏈接,但只有經過身份驗證的用戶才能真正看到所述鏈接的內容(稱為門控您的內容)
詳細說明:
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
現在到了肉(百勝!)
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.