【问题标题】:Weird CSRF error in Django with Nginx and Gunicorn使用 Nginx 和 Gunicorn 在 Django 中出现奇怪的 CSRF 错误
【发布时间】:2018-08-15 16:11:58
【问题描述】:

背景

当我尝试访问我的 Django 管理面板时,我得到了Forbidden (403) CSRF verification failed. Request aborted.,即使我禁用了 CSRF 中间件。这会影响在不同位置使用不同浏览器的所有用户。我已经按照步骤修复了stackoverflow中几个问题的错误,但仍然相同。这已经让我死了好几个星期了。

问题

我将 https 与 Cloudflare(免费计划)一起使用,但如果我停用 https,此错误仍然存​​在。这发生在mydomain.com/admin

已知事实

  1. 我正在使用 Django 2.0 和 gunicorn 19.0
  2. 我检查了浏览器的 cookie
  3. 我试过删除django.middleware.csrf.CsrfViewMiddleware
  4. 这仅发生在 Django 管理仪表板中,当启用 CSRF 中间件时,另一个 POST 或 GET 表单可以正常工作。
  5. 我已登录到我的 Django Admin 仪表板,如果我注销,我可以再次登录而没有问题,但如果我从另一个地方尝试,或者与另一个用户一起尝试,问题再次出现。
  6. Gunicorn 配置是默认配置。

配置文件

Settings.py

CSRF_TRUSTED_ORIGINS = ['.domain.com']
CSRF_COOKIE_DOMAIN = ['.domain.com', '127.0.0.1']
CSRF_COOKIE_SECURE = True
ALLOWED_HOSTS = ['127.0.0.1', 'domain.com', 'www.domain.com', '104.336.44.153', '.domain.com']

MIDDLEWARE = [
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Nginx

server {
    server_name domain.com;

    access_log off;

    location /static {
        alias /opt/myenv/myenv/static/;
    }

    location /descargas/dir/ {
        alias /opt/myenv/myenv/dir/;
    }



    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

请帮忙!谢谢阅读。

【问题讨论】:

  • 我认为它在securitymiddleware 而不是csrfviewmiddleware。尝试禁用它。
  • 完成,但 CSRF 错误仍然存​​在。
  • 你解决过这个问题吗?我自己现在正在经历类似的事情。
  • 找到任何解决方案了吗?也面临类似的问题..

标签: django nginx csrf gunicorn


【解决方案1】:

CSRF cookie 是由CsrfViewMiddleware 设置的,所以你应该保留它。

我会尝试更改您的MIDDLEWARE 订购:

MIDDLEWARE = [
 'django.middleware.security.SecurityMiddleware', # THE FIRST
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

【讨论】:

  • 现在我再次添加了 CSRF 中间件,我的主页面中的搜索表单显示 CSRF 验证失败,我在搜索输入中添加了 csrf_token。此外,Admin Dashbord 仍然显示 CSRF 错误。
  • 您可以尝试清除浏览器 cookie,然后重新加载页面吗?如果错误仍然存​​在,为确保 cookie 设置正确,请检查您的 POST 请求的请求标头(例如管理员登录)以确保它也正在发送(并且与 CSRF 令牌的值匹配表格)
  • 最可能的情况是 cookie 设置不正确,但不确定。最终尝试评论CSRF_COOKIE_DOMAIN
  • 另外,请检查您的设置,CSRF_COOKIE_SECURE 在没有 SSL 的本地环境中进行测试时可能会导致问题。
猜你喜欢
  • 2016-06-23
  • 2020-09-03
  • 2019-01-18
  • 2017-10-01
  • 1970-01-01
  • 2015-05-06
  • 2013-03-28
  • 2019-09-11
  • 2016-10-27
相关资源
最近更新 更多