我目前正在阅读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
,然后我就防止了会话固定?
这够了吗?我还能做什么?
答案 0 :(得分:8)
实际上,会话固定最常见的情况是攻击者会放置一个链接,例如到您的主页或登录页面,在URL上设置会话ID(作为GET变量)并等待一些用户登录。由于攻击者随后知道这些用户的会话ID,并且因为该会话ID可以在URL中设置,攻击者可以重新访问注册用户的个人资料页面/仪表板等链接并模拟该用户。
因此,为了防止此类攻击,会话ID重新生成就足够了,因为攻击者仍然使用未经身份验证的会话。您可以采取的另一个步骤是不接受网址中的会话ID。要做到这一点,你必须设置(如果你有权访问服务器上的这个文件或通过ini_set,请在php.ini中):
这样,即使是未经身份验证的会话,攻击者也无法设置会话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发生变化,则攻击无效。