首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django + Caddy = CSRF保护问题

Django + Caddy = CSRF保护问题
EN

Stack Overflow用户
提问于 2022-06-11 12:19:53
回答 1查看 430关注 0票数 6

我在一个码头容器中部署了一个Daphne (ASGI)的Django 4应用程序。我在前面用凯迪做反向代理。它有效,但我不能填写任何表格,因为中央应急基金的保护开始生效。例如,没有管理员登录。

我目前可以通过两种方式访问管理界面:

  1. 直接通过码头,通过SSH调谐端口
  2. 然后再把它送到码头集装箱里。

备选方案1起作用。我可以像在本地运行开发服务器一样登录管理界面。一切都如期而至。

但是,选项2 (caddy反向代理)不起作用。我可以访问Django和加载页面,但是任何表单提交都将被阻止,因为CSRF保护已经启动。

代码语言:javascript
复制
CSRF verification failed. Request aborted.

Reason given for failure:
    Origin checking failed - https://<mydomain.com> does not match any trusted origins.

我的Caddyfile包含以下内容:

代码语言:javascript
复制
<mydomain.com> {
       reverse_proxy localhost:8088
}

本地主机:8088是由我的码头集装箱公开的港口。

为了消除潜在问题,我在配置文件中将以下设置为false:

  • SECURE_SSL_REDIRECT (导致重定向循环,可能与反向代理相关)
  • SESSION_COOKIE_SECURE (我宁愿把它设置为True,但我现在还不知道)
  • CSRF_COOKIE_SECURE (同样的评论)

我可以在网上找到的唯一Django-Caddy示例已经过时,并引用了旧版本的Caddy和/或Django。Django和Daphne一起部署在ASGI上。

我已经看到了一些建议更改CSRF_TRUSTED_ORIGINS的帖子,但是我不得不添加一个已经在ALLOWED_HOSTS列表中的主机似乎是不对的。这也解释不了为什么它直接在码头容器上工作,除非localhost是CSRF的特例。

版本:

  • 卡迪: 2.5.1
  • Django: 4.0.5
  • 达芙妮: 3.0.2
  • Python: 3.10.5

知道哪里出了问题吗?我该如何调试这些问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 17:33:15

终于知道发生了什么。

我首先想知道从caddy发送到django的确切HTTP请求:

代码语言:javascript
复制
sudo tcpdump -i lo -A -n port 8088

这证实:

  • 正确设置了OriginReferer
  • csrftoken cookie已正确发送

一旦知道了这一点,我就可以从django中挖掘代码。具体来说,这个函数在CSRF中间件中。.

最后:

  1. 卡迪将http请求转发给django,未加密( Caddy和django之间的HTTP S)。
  2. Django认为该请求不安全。
  3. CSRF保护要求浏览器发送的Origin标头为http://,因为请求不安全。在我的例子中,它是https://,因为我的浏览器正在通过https与Caddy对话。
  4. 因为Origin头与CSRF中间件所期望的不匹配,所以请求被拒绝。

其实这是个简单的解决办法。

由于我们知道浏览器中的凯蒂总是会忽略 X-Forwarded-Proto并设置它本身,所以我们可以在django中将标头添加到settings.py中:

代码语言:javascript
复制
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

还有哇哦!

现在,我也可以将这些设置为真:

  • SECURE_SSL_REDIRECT
  • SESSION_COOKIE_SECURE
  • CSRF_COOKIE_SECURE

编辑这里是Caddyfile文件,根据请求:

代码语言:javascript
复制
service.mywebsite.com {
        reverse_proxy localhost:8088
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72584282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档