django解決示例
解決 Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.問題
X-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 frame , iframe 或者 object 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊。
只有當用戶使用支持X-Frame-Options的瀏覽器訪問文檔時,才提供增加的安全性。Content-Security-Policy HTTP頭中的frame-ancestors指令會替代這個非標准的header.CSP的frame-ancestors會在壁虎4.0中支持,但是並不會被所有瀏覽器支持。然而X-Frame-Options是個已廣泛支持的非官方標准,可以和CSP結合使用。
so,瀏覽器默認遵循X-Frame-Options協議頭,它表明一個資源是否允許加載到frame或者iframe中。如果響應包含值為SAMEORIGIN的協議頭,瀏覽器會在frame中加載同源請求的資源。如果協議頭設置為DENY,瀏覽器會在加載frame時屏蔽所有資源,無論請求來自於哪個站點。
語法
X-Frame-Options
有三個可能的值:
X-Frame-Options: deny X-Frame-Options: sameorigin X-Frame-Options: allow-from https://example.com/
換一句話說,如果設置為 deny
,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。另一方面,如果設置為sameorigin
,那么頁面就可以在同域名頁面的 frame 中嵌套。
deny
表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。
sameorigin
表示該頁面可以在相同域名頁面的 frame 中展示。
allow-from uri
表示該頁面可以在指定來源的 frame 中展示。
Django中提供了一些簡單的方法來在你站點的響應中包含這個協議頭:
(1)一個簡單的中間件,在所有響應中設置協議頭。
如果要為你的站點中所有的響應設置相同的X-Frame-Options值,就可以將項目中settings.py文件中的添加中間件:‘ django.middleware.clickjacking.XFrameOptionsMiddleware ’設置為‘MIDDLEWARE’:
MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
在開啟該中間件之后,默認會為任何開放的HttpResponse設置X-Frame-Options協議頭為DENY,如果你想要設置為SAMEOGIGIN,可以在settings.py文件中設置:
X_FRAME_OPTIONS = 'SAMEORIGIN'
但是這樣的話會使該站點所有的視圖都使用X-Frame-Options協議頭,對於某些視圖函數,我們可以使用特定的裝飾器告訴中間件不要設置協議頭.
(2)使用裝飾器
在views.py文件中使用裝飾器
導入模塊
from django.views.decorators.clickjacking import xframe_options_sameorigin, xframe_options_exempt,xframe_options_deny
1.引用裝飾器xframe_options_sameorigin,允許同源訪問的裝飾器
from django.views.decorators,clickjacking import xframe_options_sameorigin @xframe_options_sameorigin def send_file(request,filename): fp = open(os.path.join(UEDITOR_UPLOAD_PATH,filename),'rb') response = FileResponse(fp) response['X-Frame-Options'] = settings.X_FRAME_OPTIONS return response
2. 引用裝飾器xframe_options_exempt,告訴中間件訪問該視圖時不要設置協議頭:
from django.http import HttpResponse from django.views.decorators.clickjacking import xframe_options_exempt @xframe_options_exempt def xframe_exempt(request): return HttpResponse('這個頁面是安全的')
3.引用裝飾器xframe_options_deny, 告訴中間件訪問該視圖時屏蔽在加載frame時的所有資源:
from django.http import HttpResponse from django.views.decorators.clickjacking import xframe_options_deny @xframe_options_deny def deny_xframe(request): return HttpResponse('拒絕所有的資源')
更新信息資料 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options
這個頁面寫了通過Nginx和iis和Apache來解決這個問題,但是在我們平時的開發中可以通過設置header的值來解決這個問題