成功登录后是否重新生成会话ID足以阻止会话固定?

时间:2011-09-18 13:40:10

标签: php security session

我目前正在阅读a guide,我对此感到困惑:

  

要解决这个弱点,有助于理解其范围   问题。会话固定只是一个踩脚石 - 目的   攻击是获取可用于劫持a的会话标识符   会话。当被劫持的会话有一个时,这是最有用的   比攻击者可以通过更高级别的特权获得   合法的手段。这种特权级别可以像存在一样简单   登录。如果每次都重新生成会话标识符   是特权级别的变化,会话固定的风险是   几乎被淘汰了:

<?php
$_SESSION['logged_in'] = FALSE;
if (check_login())
{
  session_regenerate_id();
  $_SESSION['logged_in'] = TRUE;
}
?>

如果我理解正确,我只需要在session_regenerate_id()logged_in = true分配值之前设置user_id = id,然后我就防止了会话固定?

这够了吗?我还能做什么?

3 个答案:

答案 0 :(得分:8)

实际上,会话固定最常见的情况是攻击者会放置一个链接,例如到您的主页或登录页面,在URL上设置会话ID(作为GET变量)并等待一些用户登录。由于攻击者随后知道这些用户的会话ID,并且因为该会话ID可以在URL中设置,攻击者可以重新访问注册用户的个人资料页面/仪表板等链接并模拟该用户。

因此,为了防止此类攻击,会话ID重新生成就足够了,因为攻击者仍然使用未经身份验证的会话。您可以采取的另一个步骤是不接受网址中的会话ID。要做到这一点,你必须设置(如果你有权访问服务器上的这个文件或通过ini_set,请在php.ini中):

  1. session.use_only_cookies应设置为TRUE(仅使用Cookie用于php会话ID,不要通过网址传递)
  2. session.use_trans_sid应设置为FALSE(如果禁用cookie,则永远不应通过url传递会话ID)
  3. 这样,即使是未经身份验证的会话,攻击者也无法设置会话ID。

答案 1 :(得分:2)

没有。 Session Fixation利用了攻击者可以在受害者身上伪造有效会话ID的弱点,然后该会话ID用于识别受害者的会话。

成功验证后重新生成会话ID至少可以减轻攻击者可以使用受害者的身份验证会话的风险。但它并不妨碍使用受害者(未经验证的)会话。

这就是为什么你应该只通过cookie允许会话ID(参见session.use_cookies_only)。因为通常攻击者无法覆盖受害者的cookie(除了XSS或cookie forcing等其他攻击之外)。

答案 2 :(得分:1)

你是对的。只要您在升级用户权限时更改会话ID,就可以防止会话固定。

会话固定通过将受害者的会话ID设置为攻击者知道的某个ID来工作。然后攻击者等待用户登录。如果会话ID没有改变,此时攻击者可以访问用户的帐户(他有会话ID)。如果会话ID发生变化,则攻击无效。