簡體   English   中英

Django forms 在 IOS 14+ 中具有 CSRF 保護

[英]Django forms with CSRF protection in IOS 14+

IOS 14 幾個月前出現,默認阻止所有第三方 cookies 除非用戶通過禁用此選項專門啟用它們:

設置 -> Safari -> 防止跨站跟蹤

這給 Django forms 帶來了一個問題,該問題在來自第三方域的<iframe>內提供 csrf 保護,如下所示:

-----Parent website-----
|                       |
|   -----------------   |
|   |               |   |
|   |  Django form  |   |
|   |    inside     |   |
|   |    iframe     |   |
|   |               |   |
|   -----------------   |
|                       |
-------------------------

Django 表單將csrfmiddlewaretoken設置為隱藏的表單變量,還設置了一個名為csrftoken的 cookie,並在提交表單時進行表單安全驗證。

當嘗試在<iframe>中設置 cookie csrftoken時出現問題,處於第三方網站上下文中。 在 IOS 14 中,此 cookie 被拒絕。 表單仍會在沒有此 cookie 的情況下提交,但 Django 按預期拒絕表單。

我得到的確切錯誤: Forbidden (CSRF cookie not set.) ,從 Django 的角度來看是正確的。

當我們禁用 Safari 設置以允許跨站點跟蹤時,表單可以正常工作。 但這需要在用戶級別完成,這是不切實際的。 當直接在新瀏覽器 window 中提供時,該表單也可以正常工作。

現在,這是我的選擇:

  1. django 文檔中所述,在我的表單中禁用 csrf 安全性(從安全角度來看不推薦)

  2. 告訴用戶啟用第三方跟蹤(不可能)

There are a lot of references online about Django forms and IOS that are related to issues with the SameSite: None setting, but I can't find a solution to this new IOS 14 problem for enabling non-tracking cookies inside iframes. 有沒有人找到解決這個問題的方法?

對於在 IOS 瀏覽器的 iframe 中加載的第三方 web 頁面,這是一個硬性約束。 無法克服此 cookie 限制。 鑒於 IOS 正在這樣做,未來其他瀏覽器供應商也有可能遵循這種做法。

目前,唯一的方法是對預期在 iframe 中運行的 django forms 免除 CSRF。

在 forms 中豁免 CSRF 的更多詳細信息: https://docs.djangoproject.com/en/3.2/ref/csrf/#django.views.decorators.csrf.csrf_exempt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM