【问题标题】:PHP Session id cookie spoofingPHP Session id cookie 欺骗
【发布时间】:2017-12-30 03:52:30
【问题描述】:

我想知道我是否可以防止会话 id cookie 畸形。假设我有一个带有键 SESS 和值 md73i54kj98ti0uf8dftps2fa3 的 cookie,这是一个有效的会话 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)加密会话数据?

【问题讨论】:

    标签: php security session cookies


    【解决方案1】:

    对于正在创建的新会话文件,您已经有了session.use-strict-mode 的解决方案。

    但是猜测另一个会话 id 呢?你是完全正确的,如果你可以猜到另一个有效的 id,你将使用那个会话,有效地冒充它的所有者。登录后,session id是用户唯一使用的secret,相当于session的userid+password。

    那为什么这不是问题呢?因为您无法合理地猜测另一个有效的会话 ID。会话 id 是(应该)加密随机的,而且时间如此之长以至于你不能只猜测一个(更准确地说,它们有很多熵)。标准解决方案(如 PHP 和大多数其他编程语言或框架中的解决方案)提供了合理级别的安全性,但您不应实现自己的会话管理(ID 生成、验证等),除非您真的 了解您在做什么并了解安全方面。

    在您的示例中,会话 ID 似乎由 26 个小写字母和数字组成。有 26 个不同的字母和 10 个数字,因此可能的会话 id 的数量为 (26+10)^26 = 2.9 * 10^40。假设您可以每秒尝试 10 亿 (10^9) 个 id,并且您的服务器一次有 100 万个会话(这在任何情况下都不现实)。仍然需要大约 10^25 秒(约 3*10^17 年)才能正确猜出有效的会话 ID。请注意,这比宇宙的年龄方式。 :)

    当然,出于上述原因(会话 id = 会话的用户名+密码),您必须尽可能保护会话 id,例如仅将其存储在 httpOnly cookie 中,并且永远不要将其发送到URL 或明文(但始终使用 https、cookie 的安全标志和发送的 HSTS 标头等)。

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 2019-06-05
      • 2013-06-29
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多