诸如PHP Session Fixation / Hijacking之类的线程以及 Chris Shiflett 之类的一些人建议检查用户代理 ( $_SESSION['HTTP_USER_AGENT']
) 以帮助检查会话有效性。一些资源甚至推荐这样的东西:
<?php
$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';
/* Add any other data that is consistent */
$fingerprint = md5($string);
?>
然而,Chris Snyder说“浏览器代理的世界与用户的世界相比是微不足道的,因此每个用户不可能拥有一个单独的用户代理。此外,欺骗用户代理并不难。而且所以检查这个指标作为会话有效性的证明几乎没有什么实际意义”(第 7 章,第 103 页)。
当遇到相互冲突的建议以及某些建议可能已过时(例如上面的 Shiflett/PHPSec 示例,其时间戳似乎是 2005 年 3 月 18 日星期五)时,很难知道该怎么做。较新的建议,例如 Snyder(发布日期:2010 年 12 月 9 日)的建议似乎更好,但总是这样吗?(例如,尽管花了很多时间推荐使用mysqli
,但 Snyder 完全忽略了 Stack Overflow 用户似乎同意的更好选择——PDO
所以我并不完全相信 Snyder 是最终值得信赖的专家) .
所以我想我的问题有两个部分,一个是具体的(我应该费心检查用户代理吗?)和一个更笼统的(当谈到 PHP 安全的最新思想时,我应该相信谁的建议?),我的明显偏见是“相信 Stack Overflow 上的人!” ——或者我不会一开始就问,因为众包最新的想法通常是最好的主意。
在@Radu 的评论中进行有用的讨论,以澄清 HTTPS 问题——
Snyder 似乎在说两件事:1.) HTTPS 使其他工具变得不那么必要或不必要。2.) 在无法使用 HTTPS 的情况下,检查用户代理仍然不是很有用(这似乎是他不同意一些可能较旧的建议的地方)。