0

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2013-07-29T12:59:07.847 回答
1

没有浏览器发出确认请求,就无法知道浏览器是否收到了 cookie 数据。

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

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

于 2013-07-29T13:08:25.837 回答