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


本博客已停更,請轉自新博客查看 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提供了幾種在您的網站響應中包含此標頭的方法:

  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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM