【问题标题】:CSRF fails with multiple domains (not subdomains) served by Django appCSRF 因 Django 应用程序服务的多个域(不是子域)而失败
【发布时间】:2016-05-25 19:58:10
【问题描述】:

我有一个 Django 应用程序,主要在 domain.com 下提供服务,但也在其他域下提供服务(主要用于测试)。我还有一个单独的子域,为用户提供 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 也需要针对需要运行的不同测试工作。

谁能告诉我我应该如何设置它?我后悔决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开......这让我发疯了。

提前致谢。

-- 已编辑以添加其他信息--

为了它的价值,我也在使用 CORS 保护。在这种情况下,看起来也许我应该使用某种 CORS 标头而不是 CSRF,但我对 CORS 机制的理解不够充分,无法理解这是否是解决方案所在。我确实将apps.domain.com 列入了白名单,但这不适用于登录,可能也不适用于其他端点(无法通过登录来检查其他端点)。

【问题讨论】:

  • 在短期内,我已经设置了基于令牌的身份验证和 CSRF 豁免登录端点,这似乎有效但并不理想。

标签: django csrf-protection django-csrf


【解决方案1】:

在 1.9 中,添加了 CSRF_TRUSTED_ORIGINS 设置。您可以将其设置为在 csrf 引荐来源检查中有效的(子)域列表:

CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']

api.domain.com 的设置文件中设置此项,它将接受来自所有 3 个域的 POST 请求。

【讨论】:

  • 不幸的是,我无法运行 1.9。这是在带有 DjangoAppEngine 的 Google App Engine 上运行的,以使用数据存储而不是 SQL 作为数据后端,而 DAE 还没有达到 1.9。
  • 如果您使用的是 Django
猜你喜欢
  • 2015-05-08
  • 2018-06-20
  • 1970-01-01
  • 2013-11-06
  • 2020-10-02
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多