Django開發 X-Frame-Options to deny 報錯處理
阿新 • • 發佈:2020-11-20
錯誤提示
Refused to display 'http://127.0.0.1:8000/index/welcome.html' in a frame because it set 'X-Frame-Options' to 'deny'.
錯誤原因
由於借用的是開源模板,百度查詢到的問題是frame架構中間人攻擊的相關bug,但是全是Java的解決方案。找了好久,在谷歌上找到線索,問題原因:(官方文件的答案)
clickjacking中介軟體和裝飾器提供了易於使用的保護,以防止clickjacking。當惡意站點誘使使用者單擊他們已載入到隱藏框架或iframe中的另一個站點的隱藏元素時,會發生這種型別的攻擊。
現代瀏覽器採用X-Frame-Options HTTP標頭,該標頭指示是否允許在框架或iframe中載入資源。如果響應包含標頭值為的標頭,SAMEORIGIN
則瀏覽器將僅在請求源自同一站點的情況下將資源載入到框架中。如果將標頭設定為,DENY
則無論哪個站點發出請求,瀏覽器都將阻止資源載入到框架中。
Django提供了幾種在您的網站響應中包含此標頭的方法:
- 在所有響應中設定標頭的中介軟體。
- 一組檢視裝飾器,可用於覆蓋中介軟體或僅為某些檢視設定標頭。
如果X-Frame-Options
HTTP頭尚未在響應中出現,則僅由中介軟體或檢視裝飾器設定。
在Django 3.0中進行了更改:
設定的預設值 X_FRAME_OPTIONS
從更改SAMEORIGIN
為DENY
出現問題的原因在setting中的中介軟體:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', //問題在這裡 ]
處理方法
- 註釋掉上面中介軟體,但是這樣不好,容易出現中間人攻擊。
最好的方法:
- 在view中新增裝飾器
from django.shortcuts import render
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def add_staff(request):
pass
return render(request, 'login/admin-list.html')
中規中矩的方法,貌似跟第一種一樣,不清楚沒測試,希望能幫助到大家,畢竟百度不到:
- 在setting中設定:
X_FRAME_OPTIONS = 'SAMEORIGIN'