显然,我很难理解Django(2.2.4(设置对跨域环境中CSRF参数的影响。
正如我已经注意到的,如果我想将我的 Django 应用程序放入具有另一个域的网站的 iframe(例如 foo.com 上的 Django 应用程序和 bar.com 上的 iframe(,我必须设置SESSION_COOKIE_SAMESITE = None
以便在我的 Django 应用程序上发送表单。
但是,CSRF 参数是什么?经过一些试验,我注意到如果我也在 Django 设置中设置了 DjangoCSRF_COOKIE_SAMESITE = None
,我只能在 iframe 中发送 Django 表单。
但是CSRF_TRUSTED_ORIGINS
是干什么用的呢?如果我将 iframe 域(例如 bar.com(设置为列表['bar.com']
而不是CSRF_COOKIE_SAMESITE = None
我无法在 iframe 中的 Django 应用程序上发送表单。
谁能解释一下在什么情况下CSRF_TRUSTED_ORIGINS
有任何影响?它是否只能在具有一个域和服务器子域的环境中使用?
感谢您的任何提示!
简而言之:CSRF_COOKIE_SAMESITE
影响浏览器行为,而CSRF_TRUSTED_ORIGINS
影响 Django 的行为。您需要确保两者设置正确。
CSRF_COOKIE_SAMESITE
设置只是确定用于 CSRFSetCookie
SameSite
指令(如果有(。然后,浏览器将使用该指令来确定是否在请求中包含cookie。
CSRF_TRUSTED_ORIGINS
设置允许您对 Django 的默认行为进行例外,即严格检查具有 CSRF 保护的传入请求的Host
和Referer
标头。有关此检查的更多信息,请参阅文档。
所以,当你没有将CSRF_COOKIE_SAMESITE
设置为None
时,Django 使用了它的默认值'Lax'
,它指示浏览器不要用不安全的请求(如POST
(跨域发送 cookie 。由于饼干没有发送,CSRF_TRUSTED_ORIGINS
无关紧要。