我想知道我是否可以阻止会话ID cookie畸形。假设我有一个密钥为 SESS 的cookie,其值为 md73i54kj98ti0uf8dftps2fa3 ,这是一个有效的会话ID,并且我的会话存储文件夹中存在相应的文件 sess_md73i54kj98ti0uf8dftps2fa3 。如果我将关键SESS cookie的值修改为例如 foo ,它将在会话文件夹中创建名为 sess_foo 的新文件。如何检查提供的cookie sess id值是否无效,以便我可以调用session_regenerate_id
来设置有效ID并创建适当的文件。
另外,我想知道是否有人假设将cookie sess id重命名为另一个用户的真实会话,他是否会获得控制权?有办法解决这个问题吗?
谢谢。
更新1:第一个问题可以通过session.use-strict-mode
ini指令解决。 http://php.net/manual/en/session.configuration.php#ini.session.use-strict-mode
虽然在使用自定义会话处理程序时需要一些额外的步骤。 (我的情况)。
但是,如果更改会话ID与其他用户的真实会话ID匹配,那么仍然如何我应该使用某种指纹识别(user-agent + ip)还是使用(user-agent + ip)的组合密钥加密会话数据?
答案 0 :(得分:1)
对于正在创建的新会话文件,您已经拥有session.use-strict-mode
的解决方案。
但猜猜另一个会话ID呢?你是完全正确的,如果你可以猜出另一个有效的id,你将使用那个会话,有效地冒充它的主人。登录后,会话ID是用户使用的唯一秘密,相当于会话的用户ID +密码 。
为什么这不是问题呢?因为您无法合理地猜出另一个有效的会话ID。会话ID(应该)是加密随机的,并且只要你猜不到一个(更准确地说,它们有很多熵)。标准解决方案,如PHP中的解决方案和大多数其他编程语言或框架提供了合理的安全级别,但您不应实现自己的会话管理(ID生成,验证等),除非您真的知道你在做什么,并了解安全方面。
在您的示例中,会话ID似乎由26个小写字母和数字组成。有26个不同的字母和10个数字,因此可能的会话ID数量为(26 + 10)^ 26 = 2.9 * 10 ^ 40。假设您每秒可以尝试十亿(10 ^ 9)个ID,并且您的服务器同时拥有一百万个会话(这在任何情况下都不是现实的)。正确猜测有效会话ID仍需要大约10 ^ 25秒(〜3 * 10 ^ 17年)。请注意,这比方式更接近宇宙的年龄。 :)
当然,由于上述原因(会话ID =用户名+会话密码),您必须尽可能多地保护会话ID,例如仅将其存储在httpOnly cookie中,并且永远不要将其发送到URL或明文(但总是使用https,带有cookie的安全标志,以及发送的HSTS标头等)。