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

Php 成功登录后重新生成会话ID是否足以防止会话固定?,php,security,session,Php,Security,Session,我目前正在阅读,对此我有点困惑: 要解决这一弱点,有助于理解 问题会话固定仅仅是实现目标的垫脚石 攻击的目的是获取可用于劫持会话的会话标识符 一场当被劫持的会话具有 比攻击者可以通过以下方式获得的权限级别更高 合法手段。这种特权级别可以简单到 登录。如果每次都重新生成会话标识符 如果权限级别发生变化,则会话固定的风险 实际消除: 如果我正确理解了这一点,我只需要进行一次session\u regenerate\u id(),然后再分配一个值,比如logged\u in=true或user\u

我目前正在阅读,对此我有点困惑:

要解决这一弱点,有助于理解 问题会话固定仅仅是实现目标的垫脚石 攻击的目的是获取可用于劫持会话的会话标识符 一场当被劫持的会话具有 比攻击者可以通过以下方式获得的权限级别更高 合法手段。这种特权级别可以简单到 登录。如果每次都重新生成会话标识符 如果权限级别发生变化,则会话固定的风险 实际消除:


如果我正确理解了这一点,我只需要进行一次
session\u regenerate\u id()
,然后再分配一个值,比如
logged\u in=true
user\u id=id
,然后我就对会话固定进行了保护


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

你说得对。只要在升级用户权限时更改会话id,您的会话就不会被固定

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

否。攻击者可以利用攻击者在受害者身上强加有效会话id的弱点,从而使用该会话id识别受害者的会话

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


这就是为什么您应该只允许通过cookie访问会话ID(请参阅)。因为通常攻击者无法覆盖受害者的cookie(XSS或其他攻击除外)。

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

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

  • session.use_only_cookies应设置为TRUE(仅对php会话id使用cookies,不要通过url传递)
  • session.use_trans_sid应设置为FALSE(如果禁用cookie,则决不应通过url传递会话ID)

  • 这样,攻击者甚至无法为未经验证的会话设置会话id。

    这应该足够了,因为您正在更改会话id,然后攻击者就无法再知道它了。会话固定是猜测另一个用户的会话id,重新生成该id可以解决这个问题。仅供参考:PHP中的会话固定还存在“会话采用”漏洞——攻击者可以选择任意会话id来创建新会话(PHP将自动为您创建会话)。这就是为什么a)除非绝对必要,否则不要使用会话;b)通过重新生成id来减轻攻击。
    <?php
    $_SESSION['logged_in'] = FALSE;
    if (check_login())
    {
      session_regenerate_id();
      $_SESSION['logged_in'] = TRUE;
    }
    ?>