CSRF 因 Django 应用程序服务的多个域(不是子域)而失败
CSRF fails with multiple domains (not subdomains) served by Django app
我有一个主要在 domain.com 下提供服务的 Django 应用程序,但也在其他域下提供服务(主要用于测试)。我还有一个单独的子域,用于为用户提供 Web 应用程序客户端代码。
API 的主域是 api.domain.com
,正在将应用程序部署到 apps.domain.com
。登台服务器不在同一个域名下;他们住在 stagingX.otherdomain.com
。这是我无法控制的。
我遇到的问题是当我尝试从 apps.domain.com
:
登录时遇到 CSRF 失败
Failed to load resource: the server responded with a status of 403 (OK)
login error: "CSRF Failed: Referer checking failed - http://apps.domain.com/ does not match https://api.domain.com/."
这是一个简单的世界,我只需将 CSRF_COOKIE_DOMAIN
设置为 *.domain.com
即可完成。然而,这完全破坏了我在部署之前暂存代码的能力,因为在 stagingX.otherdomain.com
直接访问 API 也需要为需要 运行.[=19= 的不同测试工作]
任何人都可以告诉我我应该如何设置它吗?我决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开……这让我抓狂。
提前致谢。
-- 已编辑以添加更多信息 --
为了它的价值,我也在使用 CORS 保护。在这种情况下,看起来也许我应该使用某种 CORS header 而不是 CSRF,但我对 CORS 机制的理解还不够充分,无法理解这是否是解决方案所在。我确实已将 apps.domain.com
列入白名单,但这不适用于登录,也可能不适用于其他端点(无法通过登录来检查其他端点)。
在 1.9 中,添加了 CSRF_TRUSTED_ORIGINS
设置。您可以将其设置为在 csrf 引荐来源检查中有效的(子)域列表:
CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']
在 api.domain.com
的设置文件中设置此项,它将接受来自所有 3 个域的 POST 请求。
我有一个主要在 domain.com 下提供服务的 Django 应用程序,但也在其他域下提供服务(主要用于测试)。我还有一个单独的子域,用于为用户提供 Web 应用程序客户端代码。
API 的主域是 api.domain.com
,正在将应用程序部署到 apps.domain.com
。登台服务器不在同一个域名下;他们住在 stagingX.otherdomain.com
。这是我无法控制的。
我遇到的问题是当我尝试从 apps.domain.com
:
Failed to load resource: the server responded with a status of 403 (OK)
login error: "CSRF Failed: Referer checking failed - http://apps.domain.com/ does not match https://api.domain.com/."
这是一个简单的世界,我只需将 CSRF_COOKIE_DOMAIN
设置为 *.domain.com
即可完成。然而,这完全破坏了我在部署之前暂存代码的能力,因为在 stagingX.otherdomain.com
直接访问 API 也需要为需要 运行.[=19= 的不同测试工作]
任何人都可以告诉我我应该如何设置它吗?我决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开……这让我抓狂。
提前致谢。
-- 已编辑以添加更多信息 --
为了它的价值,我也在使用 CORS 保护。在这种情况下,看起来也许我应该使用某种 CORS header 而不是 CSRF,但我对 CORS 机制的理解还不够充分,无法理解这是否是解决方案所在。我确实已将 apps.domain.com
列入白名单,但这不适用于登录,也可能不适用于其他端点(无法通过登录来检查其他端点)。
在 1.9 中,添加了 CSRF_TRUSTED_ORIGINS
设置。您可以将其设置为在 csrf 引荐来源检查中有效的(子)域列表:
CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']
在 api.domain.com
的设置文件中设置此项,它将接受来自所有 3 个域的 POST 请求。