我正在构建一个会话控制库,该库旨在在会话存储上实现一种(有限的)安全形式,以防止会话劫持(没有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被禁用或未收到确认的情况下,您仍将接受上一次确认的会话。