了解 Django CSRF_COOKIE_SAMESITE 和 CSRF_TRUSTED_ORIGINS

Mik*_*e42 3 django iframe csrf cross-domain

显然我在理解跨域环境中关于CSRF参数的Django(2.2.4)设置的影响时遇到了问题。

正如我已经注意到我必须设置 SESSION_COOKIE_SAMESITE = None是否要将我的 Django 应用程序放入具有另一个域的网站的 iframe(例如 foo.com 上的 Django 应用程序和 bar.com 上的 iframe),以便在我的 Django 应用程序上发送表单.

但是,CSRF 参数是什么?经过一些试验,我注意到如果我也在CSRF_COOKIE_SAMESITE = NoneDjango 设置中进行了设置,我只能在 iframe 中发送 Django 表单。

但是有什么CSRF_TRUSTED_ORIGINS用呢?如果我将 iframe 域(例如 bar.com)设置为列表['bar.com']而不是CSRF_COOKIE_SAMESITE = None我无法在 iframe 中的 Django 应用程序上发送表单。

任何人都可以解释在什么情况下 CSRF_TRUSTED_ORIGINS有什么影响吗?它是否只能在具有一个域和多个子域的环境中使用?

感谢您的任何提示!

Kev*_*nry 6

简而言之:CSRF_COOKIE_SAMESITE影响浏览器行为,同时CSRF_TRUSTED_ORIGINS影响 Django 的行为。您需要确保两者都设置正确。

CSRF_COOKIE_SAMESITE设置仅确定SameSite用于 CSRF 的指令(如果有)SetCookie。然后浏览器将使用该指令来确定是否在请求中包含 cookie。

CSRF_TRUSTED_ORIGINS设置允许您对 Django 的默认行为进行例外处理,即严格检查具有 CSRF 保护的传入请求的HostReferer标头。有关此检查的更多信息,请参阅文档

所以,当你没有设置CSRF_COOKIE_SAMESITE为 时 None,Django 使用它的默认值'Lax',它指示浏览器不要发送带有不安全请求(如POST)的跨域 cookie 。由于未发送cookie,CSRF_TRUSTED_ORIGINS因此无关紧要。