sea*_*olf 2 django django-csrf csrf-protection
我有一个 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/."
Run Code Online (Sandbox Code Playgroud)
这一个简单的世界,我会简单地设置CSRF_COOKIE_DOMAIN于*.domain.com和完成。但是,这完全破坏了我在部署之前暂存代码的能力,因为直接访问 APIstagingX.otherdomain.com也需要适用于需要运行的不同测试。
任何人都可以启发我我应该如何设置它?我正在后悔决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开......这让我发疯。
提前致谢。
-- 编辑以添加其他信息 --
对于它的价值,我也在使用 CORS 保护。在这种情况下,看起来我可能应该使用某种 CORS 标头而不是 CSRF,但我对 CORS 机制的了解不够充分,无法了解这是否是解决方案所在。我确实已apps.domain.com列入白名单,但这不适用于登录,也可能不适用于其他端点(无法通过登录来检查其他端点)。
在 1.9 中,CSRF_TRUSTED_ORIGINS添加了该设置。您可以将其设置为在 csrf 引用检查中有效的(子)域列表:
CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']
Run Code Online (Sandbox Code Playgroud)
在 的设置文件中设置此项,api.domain.com它将接受来自所有 3 个域的 POST 请求。
| 归档时间: |
|
| 查看次数: |
1913 次 |
| 最近记录: |