【发布时间】: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