检查cookie是否已到达客户端';s浏览器,而不等待下一次连接


Checking if a cookie has made it to the client's browser without waiting for the next connection

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

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

但这确实提供了一个小的安全漏洞,黑客可能会在短时间内利用这个漏洞,我目前正在努力填补这个漏洞。

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

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

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

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

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

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

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

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

在javascript被禁用或未收到确认的情况下,您仍将接受上一次确认的会话。