来自dockerized nginx后面dockerized Django的CSRF验证错误

8xiog9wr  于 7个月前  发布在  Nginx
关注(0)|答案(1)|浏览(119)

我有两个Docker容器一起运行,一个用于使用gunicorn的Django应用程序,另一个用于nginx服务静态文件并将请求重定向到Django应用程序。

  1. Django/gunicorn服务器,只暴露于nginx(8000),
    1.在docker容器中暴露的nginx服务器(80),以及
    1.在使用docker容器时,外部会发生这种情况(所以我将端口Map到另一个端口,比如8888)。我还使用“xyz.local”主机名从docker运行的设备访问它。这一切都发生在家庭网络中,不涉及HTTPS。
    现在,当我提交一个表单时,例如管理界面的登录表单,我得到一个CSRF验证失败,说xyz.local:8888不是一个可信的来源。
    我知道我可以将"http://xyz.local:8888"添加到CSRF_TRUSTED_ORIGINS以使其工作,或者完全禁用CSRF保护,但我想知道这是否是此设置中正确/最佳的方法。
    我想让Django docker容器尽可能地不知道外部世界,这样我就可以在另一个具有不同主机名的设备上运行它,或者使用不同的端口使用不同的docker-compose配置,而不必重建docker容器或为docker外部使用的主机和端口引入ENV变量。
    我是nginx和docker的新手。我可以在nginx.conf或Django的settings.py?中使用不同的设置来使其工作吗?
    以下是我认为nginx.conf的相关部分(否则主要是处理静态文件的内容):
server {
        listen 80;

        location / {
            proxy_pass http://web:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_redirect off;
        }
        ...
    }

字符串
docker-compose.yml:

version: '3'
services:
  web:
    image: mydjangoapp
    expose:
      - "8000"
    volumes:
      ...

  nginx:
    image: nginx
    ports:
      - "8888:80"
    volumes:
      - /volume1/myapp/nginx.conf:/etc/nginx/nginx.conf
      ...
    depends_on:
      - web


我的Django的settings.py是相当标准的,因为它在初始化一个新的Django项目时出现。
我已经在这里和其他地方阅读了几个相关的问题-大多数似乎只有在引入HTTPS时才有问题,但有些似乎有类似的问题-并尝试在nginx.conf和settings.py中包含不同的设置,例如nginx.conf中的proxy_set_header X-Forwarded-Port $server_port;proxy_set_header X-Forwarded-Host $host;以及settings.py中的USE_X_FORWARDED_HOST = TrueUSE_X_FORWARDED_PORT = True,或者我在settings.py中包含CSRF_COOKIE_SECURE = False。坦率地说,不知道我在那里做什么,只是尝试在类似情况下帮助其他人。

5ssjco0h

5ssjco0h1#

我知道我可以将“http://xyz.local:8888“添加到CSRF_TRUSTED_ORIGINS以使其工作
在我看来,你正在做的是一种正确的做法。
Django的某些配置与其运行环境有关,例如ALLOWED_HOSTS或CSRF_TRUSTED_ORIGINS。这是无法避免的。
正如您所建议的,您可以使用环境变量轻松地将此配置从一个环境更改到另一个环境。
另一种方法是拥有多个设置文件,并使用DJANGO_SETTINGS_MONTHEAD环境变量来确定根据环境使用哪个文件。
请注意,对于SECRET_KEY或数据库密码等敏感设置,出于安全原因,绝对建议不要使用设置文件。

相关问题