繁体   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