【问题标题】:PHP Session Security: usefulness of checking $_SESSION['HTTP_USER_AGENT']PHP 会话安全:检查 $_SESSION['HTTP_USER_AGENT'] 的用处
【发布时间】:2011-08-04 01:34:39
【问题描述】:

PHP Session Fixation / Hijacking 等线程和 Chris Shiflett 等一些人建议检查用户代理 ($_SESSION['HTTP_USER_AGENT']) 以帮助检查会话有效性。一些resources 甚至推荐这样的东西:

<?php

$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';

/* Add any other data that is consistent */

$fingerprint = md5($string);

?>

然而,Chris Snyder 表示“浏览器代理的世界与用户的世界相比是微不足道的,因此每个用户不可能拥有一个单独的用户代理。此外,欺骗一个用户代理。因此,检查此指标作为会话有效性的证明几乎没有什么实际意义”(第 7 章,第 103 页)。

当遇到相互冲突的建议以及某些建议可能已过时(例如上面的 Shiflett/PHPSec 示例,其时间戳似乎是 3 月 18 日星期五, 2005)。较新的建议,例如 Snyder(发布日期:2010 年 12 月 9 日)的建议似乎更好,但总是这样吗? (例如,尽管花了很多时间推荐使用 mysqli,但 Snyder 完全忽略了 Stack Overflow 用户似乎同意的更好选择 -- PDO -- 所以我并不完全赞同 Snyder作为最终值得信赖的专家)。

所以我想我的问题有两个部分,一个是具体的(我应该费心检查用户代理吗?)和一个更一般的(当谈到 PHP 安全的最新思想时,我应该相信谁的建议?),我很明显偏见是“信任 Stack Overflow 上的人!” -- 或者我一开始就不会问,因为众包最新的想法通常是最好的主意。

在 cmets w/@Radu 进行有用的讨论后,澄清 HTTPS 问题 --

Snyder 似乎在说两件事:1.) HTTPS 降低了其他工具的必要性或不必要性。 2.) 在无法使用 HTTPS 的情况下,检查用户代理仍然不是很有用(这似乎是他不同意一些可能较旧的建议的地方)。

【问题讨论】:

  • 我不会太担心 mysqli 与 PDO。它们都支持预处理语句并且都比 ext/mysql 好得多,PDO 只是不依赖于 MySQL 作为它的 RDBMS。
  • Chris,我同意 PDO 和 mysqli 非常相似,并且都比 ext/mysql 好,我只是觉得奇怪的是作者根本没有提到 PDO。总体而言,这本书看起来确实是最新的并且很有帮助,但是 StackOverflow 不可避免地会通过不断更新(一如既往地持保留态度)获得最终决定权。
  • 是的,我在 mysqli 上遇到的资料也比 PDO 多得多。 PDO 是 PHP 的一个稍新的补充(包含在 PHP5.1+ 中,而不是 5.0+),也许这就是原因。

标签: php security session-hijacking


【解决方案1】:

如果中间的人可以劫持会话 ID,那么他在发送相同的用户代理方面应该绝对没有问题,所以我认为这不会让你到任何地方。这是默默无闻的安全。

如果您想要真正的保护,请使用 HTTPS。

【讨论】:

  • 我假设目标是使用 HTTPS,但也使用任何其他工具也会有所帮助。我相信 Snyder 是在说,“嘿,一旦你使用了 HTTPS,就没有必要再浪费时间检查用户代理了”。
  • @Carole,这是真的。一旦你使用了 HTTPS,那么所有这些事情都不再重要了,因为伪造攻击将变得不切实际。
  • 再想一想整章,我想他在说两件事。 1.) HTTPS 使其他工具变得不那么必要或不必要。 2.) 在无法使用 HTTPS 的情况下,检查用户代理仍然不是很有用(这似乎是他不同意一些可能较旧的建议的地方)。
  • @Carole,确实,再次,这是默默无闻的安全。 HTTP 请求中的任何内容都可能被欺骗。如果黑客不知道他也需要包含用户代理,他会很容易弄清楚。最后,他可以简单地发送整个请求,就像他从受害者那里得到它一样。如果他只对间谍感兴趣,那么这正是他默认会做的事情。
  • 这假定了一种“中间人”攻击方法,其中黑客以明文形式看到 http 标头,因此会看到会话 cookie 和所有流量。因此,您所说的(使用 ssl 加密)将是简单的答案。但是,难道不能想象攻击者可以通过其他方式获得对会话 cookie 的访问权限吗?也许是一个javascript。在这种情况下,检查用户代理是否会提供有效的额外安全级别?毕竟,安全就是要增加正确的障碍。
【解决方案2】:

用户代理本身并不完全是万无一失的,但它在其他安全性之上增加了一层薄薄的一层。关于指纹的内容存在争议。但尽管如此,它还是增加了纵深防御原则。您可以设置 cookie 并将其与用户代理和特定单词结合使用来制作指纹。 我的观点是,它虽然增加了一点安全性!

【讨论】:

    【解决方案3】:

    会话的问题在于您只需要会话 ID 即可使用该会话。如果您知道有效的会话 ID,则可以使用该会话。这就是会话的工作方式。

    现在有人建议使用附加数据来验证某个客户端使用某个会话的有效性。用户代理 ID 是一个建议的数据,因为它是某种唯一的(请参阅 Panoptoclick 以测试您自己的)并且在会话期间不会更改(与客户端提供的其他一些信息相反)。

    但这只会降低会话固定的可能性,并防止在会话劫持的情况下意外使用外部会话。因为攻击者可以尝试获取受害者的用户代理 ID 并在修复或劫持会话时进行欺骗。在这里,无论您将用户代理 ID 存储为普通的还是作为(加盐的)哈希值都无关紧要。

    更好地使用已经证明的保护措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      相关资源
      最近更新 更多