1. 程式人生 > 實用技巧 >Django開發 X-Frame-Options to deny 報錯處理

Django開發 X-Frame-Options to deny 報錯處理

錯誤提示

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提供了幾種在您的網站響應中包含此標頭的方法:

  1. 在所有響應中設定標頭的中介軟體。
  2. 一組檢視裝飾器,可用於覆蓋中介軟體或僅為某些檢視設定標頭。

如果X-Frame-OptionsHTTP頭尚未在響應中出現,則僅由中介軟體或檢視裝飾器設定。

在Django 3.0中進行了更改:

設定的預設值

X_FRAME_OPTIONS從更改SAMEORIGINDENY

出現問題的原因在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',		//問題在這裡
]

處理方法

  1. 註釋掉上面中介軟體,但是這樣不好,容易出現中間人攻擊。

最好的方法:

  1. 在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')

中規中矩的方法,貌似跟第一種一樣,不清楚沒測試,希望能幫助到大家,畢竟百度不到:

  1. 在setting中設定:
X_FRAME_OPTIONS = 'SAMEORIGIN'