显然,我无法理解 Django (2.2.4) 设置对跨域环境中 CSRF 参数的影响。
正如我已经注意到的,如果我想将我的 Django 应用程序放入具有另一个域的网站的 iframe 中(例如,foo.com 上的 Django 应用程序和 foo.com 上的 iframe bar.com)以便在我的 Django 应用程序上发送表单。
但是 CSRF 参数是什么?经过一些试验后,我注意到如果我还在 Django 设置中设置 CSRF_COOKIE_SAMESITE = None
,我只能在 iframe 中发送 Django 表单。
但是 CSRF_TRUSTED_ORIGINS
有什么用?如果我将 iframe 域(例如 bar.com)设置到列表 ['bar.com']
而不是 CSRF_COOKIE_SAMESITE = None
我无法在我的 Django 上发送表单iframe 中的应用。
谁能解释一下 CSRF_TRUSTED_ORIGINS
在什么情况下有任何影响?它只能在一个域和多个子域的环境中使用吗?
感谢任何提示!
最佳答案
简而言之:CSRF_COOKIE_SAMESITE
影响浏览器行为,而 CSRF_TRUSTED_ORIGINS
影响 Django 的行为。您需要确保两者都已正确设置。
CSRF_COOKIE_SAMESITE
设置只是决定什么 SameSite
指令(如果有)用于 CSRF SetCookie
.然后浏览器将使用该指令来确定是否在请求中包含 cookie。
CSRF_TRUSTED_ORIGINS
那里的设置允许您对 Django 的默认行为进行异常(exception)处理,即严格检查带有 CSRF 保护的传入请求的 Host
和 Referer
header 。参见 the documentation有关此支票的更多信息。
因此,当您没有将 CSRF_COOKIE_SAMESITE
设置为 None
时,Django 使用其默认值 'Lax'
,它指示浏览器不要使用不安全的请求(如 POST
)跨域发送 cookie。由于未发送 cookie,因此 CSRF_TRUSTED_ORIGINS
无关紧要。
关于django - 了解 Django CSRF_COOKIE_SAMESITE 和 CSRF_TRUSTED_ORIGINS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569508/