在多个子域中共享Django会话的缺点

4 投票
2 回答
1408 浏览
提问于 2025-04-17 09:42

我用Django搭建了一个网站,使用了站点框架,并在不同的子域名上创建了四个网站。我们称它们为one.mydomain.com、two.mydomain.com等等。

其中三个是产品网站,一个是商店。我希望用户在不同的产品网站和商店之间切换时,不用重新登录。虽然我知道可以用cas来实现单点登录,但我觉得这并不能完全满足我的需求。

我看过这篇文章这篇文章,它们讨论了在子域名之间共享会话的问题,大家的观点似乎是这并不是个好主意。

在我的情况下,我希望用户能够在一个子域名上添加商品到购物车,然后去购物车结账。我找不到不共享会话的办法。用户还应该能够从另一个产品网站添加商品到购物车,结账时能看到来自one.mydomain.com和two.mydomain.com等的商品。

所以我的问题是,除了可能的冲突,为什么共享会话是个坏主意?假设我确保只有用户登录信息会发生冲突(并且应该发生)。

我的设置是所有网站共享一个SECRET_KEY,并且SESSION_COOKIE_DOMAIN设置为'.mydomain.com'。这样的设置有没有什么严重的安全隐患我没有注意到?

谢谢 ./w

2 个回答

0

根据我读过的很多资料,把会话在不同的网站之间共享被认为是个坏主意。这可能会导致一些很难找到的错误。一般来说,保持系统尽量无状态是更好的做法。

1

我觉得这在某些情况下是个安全漏洞,特别是当你不能控制一个特定域名下的所有子域名时。比如说,你有一个叫做 one.mydomain.com 和另一个叫做 two.mydomain.com 的网站,但由于你的设置是 SESSION_COOKIE_DOMAIN='.mydomain.com',浏览器也会把你的 cookie 发送给一个叫 bad.mydomain.com 的网站。

另一个潜在的问题是,如果你把开发环境设置成一个子域名(比如 dev.mydomain.com),那么你就不会有隔离保护了。

根据我对这个话题的研究,最糟糕的情况是你的 cookie 会被发送到一些不安全的子域名,这样可能会有人利用这个 cookie 劫持你的真实会话。

目前我正在进一步研究如何更好地隔离不同的子域名(虽然它们都是由同一个 Django 实例控制),但看起来除了重写 SessionMiddleware 之外,似乎没有什么好的办法。

撰写回答