我试图将我的 django 应用程序锁定为仅 HTTPS 访问。如果只有 SESSION_SAVE_EVERY_REQUEST 为 True 或只有 SESSION_COOKIE_SECURE 为 True,则一切似乎都工作正常,但如果在我的设置中两者均为 True,则 request.session 会变为空白,从而破坏整个站点的用户身份验证。
我认为这是因为我有重定向到 HTTPS 的 HTTP 请求,但在执行此操作之前触发了会话保存,这会使用匿名用户创建一个新的、覆盖的 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 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 请求执行。以前有人尝试过吗?
找到了!我需要设置一个设置来让 django 相信我确实在 https 上,即使我躲在 nginx 后面:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
参考:https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)