PHP会话ID cookie欺骗

问题描述 投票:1回答:1

我想知道我是否可以防止会话ID cookie畸形。假设我有一个带有密钥SESS和值md73i54kj98ti0uf8dftps2fa3的cookie,这是一个有效的会话ID,相应的文件sess_md73i54kj98ti0uf8dftps2fa3存在于我的会话存储文件夹中。如果我将密钥SESS cookie的值修改为例如foo,它将在名为sess_foo的sessions文件夹中创建新文件。如何检查提供的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)的组合密钥加密会话数据?

php security session cookies
1个回答
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标头等)。

© www.soinside.com 2019 - 2024. All rights reserved.