CSRF验证失败 - 当主机安全时,Referer不安全

Far*_*orn 7 django django-csrf django-1.9

我将Django从1.8升级到1.9.之后,在Django管理员登录后,我在本地主机上收到此错误:

Referer checking failed - Referer is insecure while host is secure.

生产中的一切都很好.以下是我的settings.py文件的片段:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
Run Code Online (Sandbox Code Playgroud)

YPC*_*ble 5

settings.py文件中的这些行在生产环境中没有问题,因为您使用的是附加到您的域的 SSL 证书。但是,在本地您可能正在使用http://localhost:8000或类似的东西。如果您尝试通过连接进行连接,https://localhost:{{YOUR_PORT_NUMBER}}您很可能会收到类似ERR_SSL_PROTOCOL_ERROR.

问题出在django/django/middleware/csrf.py 的第 167-168 行。当您https在生产中使用时,request.is_secure()正在返回True……这要求HTTP_REFERER也为真,否则您将收到您引用的错误。

一种解决方案是根据您是在本地还是生产环境中调整您的settings.py文件。这样您就可以将这三行添加到一个settings_production.py文件中,该文件导入本地主机和您的生产服务器通用的其他设置。您的本地主机将使用一组不同的设置,其中不包括这些行。

  • 我能够解决这个问题。我正在使用的另一个库 `django-cors-headers` 导致了这个问题。我不得不通过添加`CORS_REPLACE_HTTPS_REFERER = True`来避免这种情况。问题就解决了。:) 不管怎么说,还是要谢谢你。 (4认同)

okr*_*tny 5

当我从 ssl 设置切换到无 ssl 并且忘记从 nginx 配置中的上游配置中删除最后一行时,我遇到了这个错误:

  location / {
    proxy_pass http://127.0.0.1:8085;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host; #:8080;
    #proxy_set_header X-FORWARDED-PROTO https;

  }
Run Code Online (Sandbox Code Playgroud)