1. 事件起因
事件的起因是這樣的,我在使用Django服務的時候,想在一個已經存在某個按鈕的主頁面上,單擊這個按鈕彈出某個功能頁面,設置某些內容,然后再退回到主頁面。
我使用了某個插件,在彈出的頁面上顯示我請求的鏈接被服務器拒絕。
在使用瀏覽器調試的console頁面中有如下的提示信息:Refused to display '頁面url' in a frame because it set 'X-Frame-Options' to 'deny'.
那么就知道是是X-Frame-Options設置出了問題。
2. 有關X-Frame-Options
2.1 什么是X-Frame-Options
X-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 <frame>, </iframe> 或者 <object> 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊。
2.2 X-Frame-Options選項
X-Frame-Options 有三個值:
DENY :表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許
SAMEORIGIN :表示該頁面可以在相同域名頁面的 frame 中展示
ALLOW-FROM uri :表示該頁面可以在指定來源的 frame 中展示
```
換一句話說,如果設置為 DENY,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。
另一方面,如果設置為 SAMEORIGIN,那么頁面就可以在同域名頁面的 frame 中嵌套。
```
3.Django有關配置
3.1 Django默認的配置
首先,Django起禁止X-Frame-Options,使用默認設置了相關的配置。
在項目的setting.py頁面中能夠找到如下的設置:
MIDDLEWARE = [ ... 'django.middleware.clickjacking.XFrameOptionsMiddleware', ... ]
上面的內容顯示,Django的項目中默認設置了XFrameOptionsMiddleware
的中間件,這個設置將對於X-Frame-Options
的配置設置成了DENY。
在Django 3.0中,X_FRAME_OPTIONS
的默認設置從SAMEORIGIN 變成了DENY。
3.2 Django總體配置
想要總體設置項目的X-Frame-Options
可以使用如下的代碼:
X_FRAME_OPTIONS = 'SAMEORIGIN'
可以看出上面的是將X_FRAME_OPTIONS
設置成SAMEORIGIN,但是這個改變了整個項目的設置,往往只有某些頁面才需要這樣的設置,因此下面介紹在單獨的頁面上設置這些內容。
3.3 指定的網頁配置
示例一:在視圖中
from django.http import HttpResponse from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.clickjacking import xframe_options_deny from django.views.decorators.clickjacking import xframe_options_sameorigin @xframe_options_exempt def view_one(request): return HttpResponse("This page is safe to load in a frame on any site.") @xframe_options_deny def view_two(request): return HttpResponse("I won't display in any frame!") @xframe_options_sameorigin def view_three(request): return HttpResponse("Display in a frame if it's from the same origin as me.")
示例二:
@xframe_options_sameorigin @csrf_exempt def wiki_upload(request,project_id): """markdown上傳圖片""" print("收到上傳的圖片了") image_object = request.FILES.get("editormd-image-file") #image_object文件對象上傳到當前項目的存儲桶中 image_url = upload_file( request.tracer.project.bucket, request.tracer.project.region, image_object, image_object.name, ) print(image_url) #result是markdown要求返回的數據格式 result = { 'success': 1,#1成功,0失敗 'message': None, 'url': image_url } return JsonResponse(result)
從上面的相應和名稱能夠很容易看出分別的含義,不在更詳細描述。
參考內容:
原文鏈接:https://blog.csdn.net/cn_newer/article/details/103866410
1. 事件起因事件的起因是這樣的,我在使用Django服務的時候,想在一個已經存在某個按鈕的主頁面上,單擊這個按鈕彈出某個功能頁面,設置某些內容,然后再退回到主頁面。我使用了某個插件,在彈出的頁面上顯示我請求的鏈接被服務器拒絕。在使用瀏覽器調試的console頁面中有如下的提示信息:Refused to display '頁面url' in a frame because it set 'X-Frame-Options' to 'deny'.那么就知道是是X-Frame-Options設置出了問題。
2. 有關X-Frame-Options2.1 什么是X-Frame-OptionsX-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 <frame>, </iframe> 或者 <object> 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊。
2.2 X-Frame-Options選項X-Frame-Options 有三個值:
DENY :表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許SAMEORIGIN :表示該頁面可以在相同域名頁面的 frame 中展示ALLOW-FROM uri :表示該頁面可以在指定來源的 frame 中展示換一句話說,如果設置為 DENY,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。另一方面,如果設置為 SAMEORIGIN,那么頁面就可以在同域名頁面的 frame 中嵌套。
3.Django有關配置3.1 Django默認的配置首先,Django起禁止X-Frame-Options,使用默認設置了相關的配置。在項目的setting.py頁面中能夠找到如下的設置:
MIDDLEWARE = [... 'django.middleware.clickjacking.XFrameOptionsMiddleware', ...]12345上面的內容顯示,Django的項目中默認設置了XFrameOptionsMiddleware的中間件,這個設置將對於X-Frame-Options的配置設置成了DENY。在Django 3.0中,X_FRAME_OPTIONS的默認設置從SAMEORIGIN 變成了DENY。
3.2 Django總體配置想要總體設置項目的X-Frame-Options可以使用如下的代碼:
X_FRAME_OPTIONS = 'SAMEORIGIN'1可以看出上面的是將X_FRAME_OPTIONS設置成SAMEORIGIN,但是這個改變了整個項目的設置,往往只有某些頁面才需要這樣的設置,因此下面介紹在單獨的頁面上設置這些內容。
3.3 指定的網頁配置直接看代碼:
from django.http import HttpResponsefrom django.views.decorators.clickjacking import xframe_options_exemptfrom django.views.decorators.clickjacking import xframe_options_denyfrom django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_exemptdef view_one(request):return HttpResponse("This page is safe to load in a frame on any site.")
@xframe_options_denydef view_two(request):return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigindef view_three(request):return HttpResponse("Display in a frame if it's from the same origin as me.")123456789101112131415161718從上面的相應和名稱能夠很容易看出分別的含義,不在更詳細描述。————————————————版權聲明:本文為CSDN博主「cn_newer」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/cn_newer/article/details/103866410