IOS 14中具有CSRF保护的Django表单+

2024-06-01 13:54:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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设置以允许跨站点跟踪时,表单可以正常工作。但这需要在用户级别完成,这是不实际的。在新的浏览器窗口中直接提供表单时,表单也可以正常工作

现在,以下是我的选择:

  1. django docs中所述,在我的表单中禁用csrf安全性(从安全角度来看,不建议这样做)

  2. 告诉用户启用第三方跟踪(不可能)

网上有很多关于Django表单和IOS的参考资料都与SameSite: None设置有关,但我找不到解决iFrame中启用非跟踪cookie的IOS 14新问题的方法。有人找到解决这个问题的办法了吗


Tags: django用户gt表单站点cookie选项情况
1条回答
网友
1楼 · 发布于 2024-06-01 13:54:55

对于IOS浏览器中iFrame内加载的第三方网页,这是一个硬约束。没有什么可以克服这个cookie限制。鉴于IOS正在这样做,其他浏览器供应商将来也有可能遵循这种做法

目前,唯一的办法是对django表单豁免CSRF,这些表单预计将在iFrame中运行

有关豁免CSRF的更多详细信息,请参见表格:https://docs.djangoproject.com/en/3.2/ref/csrf/#django.views.decorators.csrf.csrf_exempt

相关问题 更多 >