1

诸如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 的情况下,检查用户代理仍然不是很有用(这似乎是他不同意一些可能较旧的建议的地方)。

4

3 回答 3

3

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

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

于 2011-08-03T16:57:15.153 回答
0

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

于 2011-08-03T17:28:57.893 回答
0

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

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

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

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

于 2011-08-03T17:34:39.560 回答