IOS 14几个月前推出,默认情况下会阻止所有第三方Cookie,除非用户通过禁用此选项专门启用它们:
设置->;狩猎旅行->;防止跨站点跟踪
这给Django表单带来了一个问题,该表单具有csrf保护,该保护在来自第三方域的<iframe>
内提供,如下所示:
-----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设置以允许跨站点跟踪时,表单可以正常工作。但这需要在用户级别完成,这是不实际的。在新的浏览器窗口中直接提供表单时,表单也可以正常工作
现在,以下是我的选择:
如django docs中所述,在我的表单中禁用csrf安全性(从安全角度来看,不建议这样做)
告诉用户启用第三方跟踪(不可能)
网上有很多关于Django表单和IOS的参考资料都与SameSite: None
设置有关,但我找不到解决iFrame中启用非跟踪cookie的IOS 14新问题的方法。有人找到解决这个问题的办法了吗
对于IOS浏览器中iFrame内加载的第三方网页,这是一个硬约束。没有什么可以克服这个cookie限制。鉴于IOS正在这样做,其他浏览器供应商将来也有可能遵循这种做法
目前,唯一的办法是对django表单豁免CSRF,这些表单预计将在iFrame中运行
有关豁免CSRF的更多详细信息,请参见表格:https://docs.djangoproject.com/en/3.2/ref/csrf/#django.views.decorators.csrf.csrf_exempt
相关问题 更多 >
编程相关推荐