我正在构建一个会话控制库,旨在在会话存储上实现(有限)形式的安全性,以防止会话劫持(没有SSL)。
它的工作原理是设置一个nonce cookie,在每次请求时都会更改为随机字符串。到目前为止,它运行良好,并且我提出了一种基本的方法来保持会话数据有效,如果连接过早地超时并且cookie没有到达客户端。它通过保留已设置的最后一个nonce来完成此操作,如果旧的nonce已就位,则不会更新它。它也只有几秒钟有效。
但这确实提供了一个小安全漏洞,可能被黑客利用为一个短窗口,而我正试图堵住这个漏洞。
到目前为止,我可以确定的最佳方法是以某种方式检查连接是否持续足够长的时间以便将cookie发送到客户端。我查看了connection_handling
,但我不确定Cookie是否已通过网络发送(即使normal
时状态为setcookie
)或已被浏览器。
那么,是否有任何方法可以确认是否已在客户端浏览器上设置了cookie而无需等待客户端再次发出请求?
答案 0 :(得分:2)
您无法确定客户是否在下一次请求之前收到了Cookie。
或者,您可以保留有限的随机数列表,每个随附一个标识符;这两个值将以cookie的形式发送给客户端。如果其中一个cookie未成功,则下一个请求将包含先前的标识符和值。
您可以通过限制有效标识符的数量来确定给定的nonce是否足够使用。
这与你的相似。 SSL有助于保持会话标识符的安全,但您仍然希望保留一个随机数管理系统以防止重放攻击。
答案 1 :(得分:1)
如果没有浏览器发出确认请求,则无法知道浏览器是否收到了cookie数据。
您可以使用javascript将确认请求发送回服务器,从而使之前的任何一个nonce到期,因此只有最后一个确认有效。
如果javascript被禁用或未收到确认,您仍然会接受之前确认的会话。