PHP会话ID cookie欺骗

时间:2017-12-30 03:52:31

标签: php security session cookies

我想知道我是否可以阻止会话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)的组合密钥加密会话数据?

1 个答案:

答案 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标头等)。