本博客已停更,請轉自新博客查看 https://www.whbwiki.com/318.html
錯誤提示
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'