Django HTTPS设置:为什么同时设置SESSION_SAVE_EVERY_REQUEST和SESSION_COOKIE_SECURE会话?

时间:2014-03-15 23:07:14

标签: python django session cookies https

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

我认为这是因为我有HTTP请求重定向到HTTPS但在它们这样做之前会触发会话保存,并且会创建一个新的,覆盖匿名用户的sessionid,因为该HTTP请求不会。 t发送好的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请求执行。有人曾尝试过吗?

1 个答案:

答案 0 :(得分:4)

发现它!我需要设置一个设置来说服django我真的在https上,即使我躲在nginx后面:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

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