PHP会话安全性:检查$ _SESSION ['HTTP_USER_AGENT']的有用性

时间:2011-08-03 16:54:43

标签: php security session-hijacking

诸如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)。较新的建议,如斯奈德(发布日期:2010年12月9日)似乎会更好,但总是这样吗? (例如,尽管花了很多时间建议使用mysqli,但Snyder完全忽略了Stack Overflow用户似乎认为是更好的选择 - PDO - 所以我不是完全在Snyder上作为最终值得信赖的专家出售。

所以我想我的问题有两个部分,一个是特定的(我应该费心检查用户代理吗?)还有一个更通用的(当我谈到PHP安全性的最新思想时,我应该相信他的建议吗?),我很明显偏见是“信任Stack Overflow上的人!” - 或者我不会在第一时间问,因为众筹最常见的想法往往是最好的想法。

在@Radu的评论中进行了有用的讨论,以澄清HTTPS问题 -

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

用户代理本身并不是完全傻瓜的证明,但它在其他安全性之上添加了薄层。有关指纹的内容存在争议。但是,它增加了防御深度原则。您可以设置cookie并将其与用户代理和特定单词结合使用以制作指纹。 我的观点是,它虽然很少增加安全性!

答案 2 :(得分:0)

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

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

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

更好地利用已经过验证的保护措施。