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

时间:2012-01-06 21:17:38

标签: python django session session-cookies django-sessions

我使用Sites Framework构建了一个Django站点,并在不同的子域上有四个站点。让我们称之为one.mydomain.com; two.mydomain.com ...等等。

其中三个网站是产品网站,一个是商店。我希望能够跨站点共享会话,以便用户在从任何产品站点移动到商店时不必再次登录。我意识到我可以使用cas来实现单一登录,但我认为这不符合我的所有目的。

我已经阅读了this postthis post关于子域之间的共享会话,并且共识似乎是一个坏主意。

在我的情况下,我希望用户能够将项目添加到一个子域中的购物车,然后前往购物车结帐。没有共享会话,我无法看到这样做的方法。用户还应该能够从其他产品网站添加到他们的购物车,当结账时,会看到来自one.mydomain.com的产品,来自two.mydomain.com等的产品。

所以我的问题是为什么除了潜在的冲突之外,分享会议是一个坏主意?假设我确保发生(并且应该发生)的唯一冲突是用户登录信息。

我的设置已为所有网站共享SECRET_KEY,而SESSION_COOKIE_DOMAIN ='。mydomain.com'。这个设置是否存在严重的安全缺陷?

谢谢./w

2 个答案:

答案 0 :(得分:1)

在我看来,当您不控制特定域的所有子域时,这是一个安全漏洞。例如,您有one.mydomain.com和two.mydomain.com,但浏览器会将您的cookie也提供给名为bad.mydomain.com的网站,因为您的设置有SESSION_COOKIE_DOMAIN ='。mydomain.com'。

如果将开发环境保留为子域之一(例如dev.mydomain.com),则会发生另一个潜在漏洞。如果是这种情况,你就不会被孤立。

就我研究过的主题而言,最糟糕的情况似乎是将你的cookie发给流氓子域名,所以有人可能会使用这个cookie劫持真正的会话。

此刻我正在进行进一步的研究,如何以更好的方式隔离不同的子域(由Django的同一个实例控制),但似乎没有真正的方法可以做到这一点,除了重写SessionMiddleware。

答案 1 :(得分:0)

从我读过的许多内容来看,它被认为是一个坏主意,如果您尝试在站点之间共享会话,似乎可能会创建一些非常难以追踪的错误。据我所知,通常情况下,尽可能使无状态变得更好。