python - Django HTTPS 设置 : Why does setting both SESSION_SAVE_EVERY_REQUEST and SESSION_COOKIE_SECURE break sessions?

标签 python django session cookies https

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

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

最佳答案

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

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

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

关于python - Django HTTPS 设置 : Why does setting both SESSION_SAVE_EVERY_REQUEST and SESSION_COOKIE_SECURE break sessions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430903/

相关文章:

php - 使用 HTML <form action method=GET> 在 PHP 页面中重新启动 session

java - Hibernate session 问题

r - 在 R 中维护输入/输出日志

python - 使图像边缘平滑

python - 如何识别 boolean 数组中的值序列?

python - 无法连接两个 numpy 数组

python - 无法将关键字 'is_active' 解析为字段?选项包括 : active, 管理员、电子邮件、全名、id 等

python - 带有 filter() 和 order_by() 的查询集 distinct() 不起作用

python - 在 Flask 中使用 POST 请求的输出执行 GET 请求

django - 在pythonanywhere上托管一个使用redis的Django项目