[英]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 中提供时,该表单也可以正常工作。
现在,这是我的选择:
如django 文档中所述,在我的表单中禁用 csrf 安全性(从安全角度来看不推荐)
告诉用户启用第三方跟踪(不可能)
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.