Django 之,在上傳圖片的時候出現:'X-Frame-Options' to 'deny'成功解決辦法


 django解決示例

解決 Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.問題

 

X-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 frame , iframe 或者 object 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊。

只有當用戶使用支持X-Frame-Options的瀏覽器訪問文檔時,才提供增加的安全性。Content-Security-Policy HTTP頭中的frame-ancestors指令會替代這個非標准的header.CSP的frame-ancestors會在壁虎4.0中支持,但是並不會被所有瀏覽器支持。然而X-Frame-Options是個已廣泛支持的非官方標准,可以和CSP結合使用。

 

so,瀏覽器默認遵循X-Frame-Options協議頭,它表明一個資源是否允許加載到frame或者iframe中。如果響應包含值為SAMEORIGIN的協議頭,瀏覽器會在frame中加載同源請求的資源。如果協議頭設置為DENY,瀏覽器會在加載frame時屏蔽所有資源,無論請求來自於哪個站點。

 

 

語法

X-Frame-Options 有三個可能的值:

X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/

換一句話說,如果設置為 deny,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。另一方面,如果設置為sameorigin,那么頁面就可以在同域名頁面的 frame 中嵌套。

deny

  表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。

sameorigin

  表示該頁面可以在相同域名頁面的 frame 中展示。

allow-from uri

  表示該頁面可以在指定來源的 frame 中展示。

 

 

Django中提供了一些簡單的方法來在你站點的響應中包含這個協議頭:

(1)一個簡單的中間件,在所有響應中設置協議頭。

如果要為你的站點中所有的響應設置相同的X-Frame-Options值,就可以將項目中settings.py文件中的添加中間件:‘ django.middleware.clickjacking.XFrameOptionsMiddleware ’設置為‘MIDDLEWARE’:

MIDDLEWARE = [
	'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

在開啟該中間件之后,默認會為任何開放的HttpResponse設置X-Frame-Options協議頭為DENY,如果你想要設置為SAMEOGIGIN,可以在settings.py文件中設置:

X_FRAME_OPTIONS = 'SAMEORIGIN'

 

但是這樣的話會使該站點所有的視圖都使用X-Frame-Options協議頭,對於某些視圖函數,我們可以使用特定的裝飾器告訴中間件不要設置協議頭.

(2)使用裝飾器

在views.py文件中使用裝飾器

 導入模塊

from django.views.decorators.clickjacking import xframe_options_sameorigin, xframe_options_exempt,xframe_options_deny

1.引用裝飾器xframe_options_sameorigin,允許同源訪問的裝飾器

from django.views.decorators,clickjacking import xframe_options_sameorigin

@xframe_options_sameorigin
def send_file(request,filename):
    fp = open(os.path.join(UEDITOR_UPLOAD_PATH,filename),'rb')
    response = FileResponse(fp)
    response['X-Frame-Options'] = settings.X_FRAME_OPTIONS
    return response

  

2. 引用裝飾器xframe_options_exempt,告訴中間件訪問該視圖時不要設置協議頭: 

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt

@xframe_options_exempt
def xframe_exempt(request):
	return HttpResponse('這個頁面是安全的')

 

3.引用裝飾器xframe_options_deny, 告訴中間件訪問該視圖時屏蔽在加載frame時的所有資源:

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny

@xframe_options_deny
def deny_xframe(request):
	return HttpResponse('拒絕所有的資源')

  

更新信息資料   https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

這個頁面寫了通過Nginx和iis和Apache來解決這個問題,但是在我們平時的開發中可以通過設置header的值來解決這個問題

 

 




免責聲明!

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



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