【问题标题】:Django HTTPS settings: Why does setting both SESSION_SAVE_EVERY_REQUEST and SESSION_COOKIE_SECURE break sessions?Django HTTPS 设置:为什么同时设置 SESSION_SAVE_EVERY_REQUEST 和 SESSION_COOKIE_SECURE 会中断会话?
【发布时间】:2014-04-21 06:33:33
【问题描述】:

我正在尝试将我的 django 应用程序锁定为仅限 HTTPS 访问。如果只有 SESSION_SAVE_EVERY_REQUEST 为 True 或只有 SESSION_COOKIE_SECURE 为 True,一切似乎都可以正常工作,但如果在我的设置中两者都为 True,那么 request.session 将变为空白,从而破坏整个站点的用户身份验证。

我在想这是因为我有 HTTP 请求重定向到 HTTPS,但在他们这样做之前会触发会话保存,并且会创建一个新的、覆盖匿名用户的 sessionid,因为该 HTTP 请求不会发送好的sessionid cookie。我看到这是因为登录表单提交返回一个 sessionid cookie,但是从 http:.../home 到 https:.../home 的重定向返回一个新的 sessionid cookie 值,从那时起使用。

我可能会很好地删除 SESSION_SAVE_EVERY_REQUEST,但我想尝试保留该功能,而且这些 http 重定向无论如何都是浪费的。

首先我尝试在我的 wsgi.py 中添加以下内容,因为看到了这个问题 - https://security.stackexchange.com/questions/8964/trying-to-make-a-django-based-site-use-https-only-not-sure-if-its-secure

if not os.environ.get('DEVELOPMENT'):
  os.environ['HTTPS'] = 'on'
  os.environ['wsgi.url_scheme'] = 'https'

但是 django.shortcuts.redirect('/') 和 django.contrib.auth.decorators.login_required 之后仍然使用 http 而不是 https 进行重定向,所以这非常令人困惑......

如果这不是正确的方法,那么我唯一的另一个想法是 SESSION_SAVE_EVERY_REQUEST 的自定义实现,它只对 HTTPS 请求执行。以前有人试过吗?

【问题讨论】:

    标签: python django session cookies https


    【解决方案1】:

    找到了!我需要设置一个设置来让 django 相信我真的在 https 上,即使我躲在 nginx 后面:

    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
    

    参考:https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2013-09-22
      • 1970-01-01
      • 2023-03-21
      • 2016-03-14
      相关资源
      最近更新 更多