Django的X-Frame-Options設置


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


免責聲明!

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



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