CSRF因Django app

时间:2016-02-15 01:54:05

标签: django csrf-protection django-csrf

我有一个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列入白名单,但这并不适用于登录,也许还有其他终端(无法通过登录检查其他终端)。

1 个答案:

答案 0 :(得分:4)

在1.9中,添加了CSRF_TRUSTED_ORIGINS设置。您可以将其设置为在csrf referrer check中有效的(子)域列表:

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

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