【问题标题】:Checking if a cookie has made it to the client's browser without waiting for the next connection在不等待下一个连接的情况下检查 cookie 是否已进入客户端的浏览器
【发布时间】:2013-07-29 12:52:50
【问题描述】:

我正在构建一个会话控制库,旨在在会话存储上实现一种(有限的)安全形式,以防止会话劫持(没有 SSL)。

它通过设置一个 nonce cookie 来工作,该 cookie 在每个请求上都会更改为一个随机字符串。到目前为止,它运行良好,并且我想出了一个基本的方法来保持会话数据在连接过早超时并且 cookie 无法到达客户端时保持有效。它通过保留设置的最后一个 nonce 来做到这一点,如果旧的 nonce 就位,它不会更新它。它也仅在几秒钟内有效。

但这确实提供了一个小的安全漏洞,可能会被黑客利用一小段时间来利用,我现在正试图堵住这个漏洞。

到目前为止,我能确定的最好方法是通过某种方式检查连接是否持续了足够长的时间,以便将 cookie 发送到客户端。我查看了connection_handling,但我不确定cookie 是否已通过网络发送(即使在setcookie 时状态为normal)或已被浏览器接受。

那么,有没有什么方法可以确认客户端浏览器上是否设置了cookie,而无需等待客户端发出另一个请求?

【问题讨论】:

  • 没有。只有发回 cookie 数据的浏览器才能确认它有 cookie 数据,其他的只是希望它有它

标签: php session-cookies session-hijacking


【解决方案1】:

在下一个请求之前,您无法确定客户端是否收到了 cookie。

或者,您可以保留一个有限的随机数列表,每个随机数都有其标识符;这两个值在 cookie 中发送给客户端。如果其中一个 cookie 没有成功,则下一个请求将使用之前的标识符和值。

您可以通过限制有效标识符的数量来决定给定的 nonce 是否足够新以供使用。

不过,这与您所拥有的非常相似。 SSL 将有助于保持会话标识符的安全,但您仍需要保留一个 nonce 管理系统以防止重放攻击。

【讨论】:

  • 是的,我想我必须按照这些思路做点什么。干杯
【解决方案2】:

如果没有浏览器发出确认请求,就无法知道浏览器已收到 cookie 数据。

您可以使用 javascript 将确认请求发送回服务器,从而使之前的所有 nonce 失效,因此只有最后一个确认的 nonce 有效。

如果 javascript 被禁用或未收到确认,您仍将接受之前确认的会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多