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


Is regenerating the session ID after successful login sufficient to prevent session fixation?

我最近读了一个指南,我对这个有点困惑:

方法的作用域有助于解决这个缺点问题。会话固定只是一个垫脚石——目的是攻击是为了获得一个会话标识符,该标识符可用于劫持a会话。当被劫持的会话具有高于攻击者所能获得的权限级别合法的手段。这种级别的特权可以非常简单登录。如果每次都重新生成会话标识符权限级别的变化,会话固定的风险是多少几乎消除了:

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

如果我理解正确,我只需要在我分配一个像logged_in = trueuser_id = id这样的值之前做一个session_regenerate_id(),然后我做了一个防止会话固定的保护?

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

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

因此,为了防止此类攻击,会话id再生是足够的,因为攻击者仍然使用未经身份验证的会话。您可以采取的另一个步骤是不接受url中的会话id。为此,您必须设置(如果您可以访问服务器上的该文件,可以在php.ini中设置,也可以通过ini_set设置)以下内容:
  1. 会话。use_only_cookies应该设置为TRUE(只使用cookie作为php会话id,不要通过url传递)
  2. 会话。use_trans_sid应该设置为FALSE(如果cookie被禁用,会话id不应该通过url传递)

这样,攻击者甚至不能为未认证的会话设置会话id。

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

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

No。会话固定利用了攻击者可以将有效的会话ID强加给受害者的弱点,从而该会话ID随后被用来识别受害者的会话。

在成功的身份验证后重新生成会话ID至少可以减少攻击者可以使用受害者的身份验证会话。但是它根本不能阻止使用受害者(未经身份验证)的会话。

这就是为什么你应该只允许会话id通过cookie(见session.use_cookies_only)。因为通常攻击者不能覆盖受害者的cookie(除了来自其他攻击,如XSS或cookie强制)。