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

时间:2016-01-07 17:11:38

标签: 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

2 个答案:

答案 0 :(得分:4)

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也是如此,否则您将获得你引用的错误。

一个解决方案是adjust your settings.py file depending on whether you're in your local or production environment。这样,您可以将这三行添加到settings_production.py文件中,该文件可导入localhost和生产服务器共有的其他设置。您的localhost将使用一组不包含这些行的设置。

答案 1 :(得分:1)

当我从ssl设置切换到无ssl并忘记从nginx config中的上游配置中删除最后一行时,出现了此错误:

  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;

  }