在另一个域上安全设置会话 cookie 的最佳方法

信息安全 Web应用程序 应用安全 饼干 会话管理 会话固定
2021-09-07 13:17:36

我们目前有 2 个站点http://www.foo.co.ukhttps://secure.foo.com.

www 站点没有 SSL 证书并且位于不同的域中。

我们有一个登录按钮http://www.foo.co.uk,点击它会打开一个https://secure.foo.com带有表单的 iframe,当用户登录时,它会在该域上创建一个会话 cookie ( foo.com)。

然后需要将会话 cookie 复制到,foo.co.uk以便将您重定向到http://www.foo.co.uk/setcookie.php?session=abcd1234允许我们在源域上设置相同的 cookie。

这不是一个非常安全的解决方案,所以我一直在研究如何让它变得更好 - 我发现的最好的想法是使用类似于HMACsetcookie.php 脚本的参数发送哈希,然后在另一个上验证它在创建 cookie 之前结束。

虽然这更好,但它并不能阻止中间人攻击。请记住 www 不是 SSL 安全的,我认为您无法完全阻止这种情况,因此下一个最好的方法是在哈希中包含一个时间戳,使其在 5 分钟内有效。

有没有人对我如何使它变得更好有任何想法,或者指出这种方法的任何缺陷?我将不胜感激。

2个回答

正如您已经注意到的那样,已经在未加密的 www 站点上创建此令牌将从本质上消除通过 SSL 为安全站点运行的好处,因为攻击者可以在令牌传输到未加密站点时嗅探令牌,然后在加密站点上使用它伪装成用户。

还拥有从未加密站点到您登录的加密站点的链接,这会使您面临主动 MITM 攻击,攻击者将请求重定向到他们自己的站点以获取凭据。

如果没有特别的理由不这样做,您可以将 SSL 放在两个站点上,这将有助于消除上述风险。旧的不到处使用 SSL 的主要原因(性能)可能不适用于您,具体取决于您的站点的繁忙程度和负载的严重程度。

除此之外,答案将取决于您的架构。例如,两个站点是否共享一个数据库?如果是这样,您是否可以为用户设置两个不同的会话值(一个用于 www,一个用于安全站点)并将它们关联起来?

http://www.foo.co.uk上的登录按钮,点击后会打开一个 iframe

我强烈建议更改此设置,以便当前页面重定向到 SSL 站点或打开一个新窗口 - 作为用户,我希望在输入任何身份验证令牌之前在地址栏中看到“https”!

是的,在两个系统上使用相同的会话 ID 是不安全的,并且会使您面临会话劫持。理想情况下,您希望生成引用相同会话数据的不同值。由于您使用的是 PHP,因此添加自己的会话处理程序是微不足道的 - 您需要决定哪一方可以读取/写入另一方的内容。在两个会话 id 之间使用 HMAC 或任何其他功能映射不如创建一个随机的新标识符并在数据中链接两个会话那样安全。