django3整合django-mdeditor報 ‘X-Frame-Options‘ 錯誤
背景
使用django3進行開發時,由於專案前端頁面使用iframe框架,瀏覽器錯誤提示資訊如下:
Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'
根據提示資訊發現是因為X-Frame-Options=deny
導致的。
X-Frame-Options是什麼?
The X-Frame-Options HTTP
響應頭是用來給瀏覽器 指示允許一個頁面 可否在 <frame>
, <iframe>
, <embed>
或者 <object>
中展現的標記。站點可以通過確保網站沒有被嵌入到別人的站點裡面,從而避免點選劫持(clickjacking)攻擊。
語法:
X-Frame-Options
有三個值:
- DENY :表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中巢狀也不允許
- SAMEORIGIN :表示該頁面可以在相同域名頁面的 frame 中展示
- ALLOW-FROM uri :表示該頁面可以在指定來源的 frame 中展示
根據上述X-Frame-Options
的三個值描述,只要修改django
的X-Frame-Options為SAMEORIGIN
,那麼相同域名頁面就可以使用frame
中展示。
功能:
- 點選劫持保護
clickjacking
中介軟體和裝飾器提供了易於使用的保護,以防止clickjacking
。
當惡意站點誘使使用者單擊他們已載入到隱藏框架或iframe中的另一個站點的隱藏元素時,會發生這種型別的攻擊。
-
點選劫持的例子 假設線上商店有一個頁面,已登入的使用者可以在該頁面上單擊“立即購買”來購買商品。為了方便起見,使用者選擇一直保持登入狀態。攻擊者站點可能會在自己的一個頁面上建立一個“我喜歡小馬”按鈕,然後將商店的頁面載入到透明的iframe中,從而使“立即購買”按鈕以不可見的方式覆蓋在“我喜歡小馬”按鈕上。如果使用者訪問攻擊者的網站,則單擊“我喜歡小馬”會導致無意間單擊“立即購買”按鈕,並且在不知情的情況下購買了該物品。
-
防止點選劫持 現代瀏覽器採用
X-Frame-Options HTTP
標頭,該標頭指示是否允許在框架或iframe
中載入資源。如果響應包含標頭值為的標頭,SAMEORIGIN則瀏覽器將僅在請求源自同一站點時才將資源載入到框架中。如果將標頭設定為,DENY則無論哪個站點發出請求,瀏覽器都將阻止資源載入到框架中。
django中設定X-Frame-Options
在django3.0
版本中,預設開啟點選劫持保護,Django
提供了幾種在您的網站響應中包含此標頭的方法:
-
在所有響應中設定標頭的中介軟體。
-
一組檢視裝飾器,可用於覆蓋中介軟體或僅為某些檢視設定標頭。
如果X-Frame-OptionsHTTP
頭尚未在響應中出現,則僅由中介軟體或檢視裝飾器設定。
django預設開啟點選劫持保護
- 設定
X-Frame-Options
為所有響應開啟點選劫持保護,請在setting.py
中MIDDLEWARE
輸入:
MIDDLEWARE = [
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django3.0 預設已經開啟該中介軟體!
預設情況下,中介軟體將為每個outgoing
將X-Frame-Options
標頭設定 DENY
為HttpResponse
。
設定允許同域名網站使用frame
展示,在專案的settings
中配置X_FRAME_OPTIONS
設定:
X_FRAME_OPTIONS = 'SAMEORIGIN'
基本上django安裝django-mdeditor上傳成功但編輯器前端無法顯示正確的url,報如標題所示錯誤,設定這個基本可以解決,如果還不能解決,那麼,最直接簡單粗暴的做法就是把這個中介軟體註釋掉,這個是以犧牲安全性為代價,不過個人後臺的話,我覺得無所謂!
指定檢視函式不設定X-Frame-Options
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def ok_to_load_in_a_frame(request):
return HttpResponse("This page is safe to load in a frame on any site.")
指定檢視函式設定X-Frame-Options
Django提供了以下裝飾器:
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_deny
def view_one(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_two(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
- 註解
如果要提交表單或訪問框架或iframe
中的會話cookie
,則可能需要修改CSRF_COOKIE_SAMESITE
或 SESSION_COOKIE_SAMESITE
設定。 解決方法
X_FRAME_OPTIONS = 'SAMEORIGIN'
參考網址:
相關文章
- Jenkins與gitlab持續整合配置webhook報500錯誤JenkinsGitlabWebHook
- springboot整合Batis,執行報錯,資料庫連線密碼錯誤Spring BootBAT資料庫密碼
- 專案整合Swagger遇到的錯誤Swagger
- springboot整合mina報錯Spring Boot
- oracle 報大小寫錯誤Oracle
- dbfread報錯ValueError錯誤解決方法Error
- 使用antd報less的錯誤
- 重建索引報ORA-14086錯誤索引
- Elasticsearch報Call to undefined xx makeAllSearchable()錯誤ElasticsearchUndefined
- linux安裝thefuck報gcc錯誤LinuxGC
- navicat 建立事件報語法錯誤事件
- 前端錯誤監控與上報前端
- react元件內報implementation()方法錯誤!React元件
- 異常錯誤 spring boot框架與Redis整合Unexpected character(‘≣‘ (code 8803 / 0x2263): expected a valid value...報錯Spring Boot框架Redis
- Spring Boot整合Swagger報錯:"this.condition" is nullSpring BootSwaggerNull
- org.thymeleaf.exceptions.TemplateInputException:模板錯誤報錯問題Exception
- mysql報1045錯誤是什麼意思MySql
- laravel mysql批量提交報Access denied 錯誤LaravelMySql
- Qt報Multiple definition錯誤的解決QT
- Django3使用WebSocket實現WebShellDjangoWebshell
- WEB安全~X-Frame-OptionsWeb
- ef8 Contains 查詢條件 報錯 $ 附近錯誤AI
- iis7.5錯誤 配置錯誤
- 【常見錯誤】--Nltk使用錯誤
- SAP系統合併後整合:應避免的4個錯誤
- 公司網站報502錯誤怎麼辦網站
- 資料庫報ORA-01839的錯誤資料庫
- 匯入sql時報日期型別錯誤SQL型別
- Laravel 安裝後報 500 和 404 錯誤Laravel
- 使用Boost庫報error C4996錯誤Error996
- 【ERROR】su user報'This account is currently not available'錯誤 for linuxErrorAILinux
- tasklist 遠端獲取程式報錯賬號密碼錯誤密碼
- win10 關閉自動傳送錯誤報告方法 windows10錯誤報告怎麼關閉Win10Windows
- nginx設定X-Frame-OptionsNginx
- springcloud和Eureka整合時報錯:Unable to start embedded TomcatSpringGCCloudTomcat
- nginx 錯誤除錯Nginx除錯
- 01整合學習-概述、Bagging-隨機森林、袋外錯誤率隨機森林
- PbootCMS錯誤提示:執行SQL發生錯誤!錯誤:no such column: def1bootSQL