【问题标题】:When and why I should use session_regenerate_id()?何时以及为什么我应该使用 session_regenerate_id()?
【发布时间】:2014-05-22 19:17:30
【问题描述】:

为什么以及何时应该在 php 中使用 session_regenerate_id() 函数? 使用session_start() 后是否应该一直使用它? 我听说我必须使用它来防止会话固定,这是唯一的原因吗?

【问题讨论】:

  • 因为在会话启动后创建了它,并且在您启动会话时在另一个页面上存在变量:-
  • @HaRsH 哦? Session_regenerate_id 删除旧的会话 ID,并创建一个新的 ID,以避免使用 XSS 劫持会话。它对 SESSION 变量在其他文档中的可见性没有任何影响。
  • 是的,我知道我对其他变量没有影响,但是如果您没有在该页面上启动会话,则该变量不会出现在核心 php 中的该页面上
  • 但这是关于 session_regenerate_id,而不是关于 session_start...
  • 我建议阅读提出它的 RFC:wiki.php.net/rfc/precise_session_management

标签: php session session-fixation


【解决方案1】:

您应该使用session_regenerate_id() 来阻止会话劫持和会话固定。

来自this Security.SE answer:

会话劫持是指窃取会话cookie。这在与其他计算机共享本地网络时最容易实现。例如。在星巴克。示例...会话 Y 的用户正在星巴克浏览 James 的网站。我正在监听他们的网络流量,喝着我的拿铁咖啡。我将用户与会话 Y 的 cookie 用于 James 的网站并将我的浏览器设置为使用它们。现在,当我访问 James 的网站时,James 的网站。

来自this webpage:

会话固定是一种强制用户会话 ID 为显式值的攻击技术。根据目标网站的功能,可以使用多种技术来“修复”会话 ID 值。这些技术的范围从跨站点脚本攻击到使用先前发出的 HTTP 请求来填充网站。在用户的会话 ID 被修复后,攻击者将等待该用户登录。一旦用户这样做,攻击者就会使用预定义的会话 ID 值来假设相同的在线身份。

何时使用

当用户编辑/更新一些可能危及网站安全或隐私政策的重要输入(更改密码、凭据、忘记密码等)时。

另见:

PHP Security Guide: Sessions

Session Fixation(Nice read)

【讨论】:

    【解决方案2】:

    什么是session_regenerate_id()?

    正如函数名所说,它是一个将当前会话ID替换为新的,并保留当前会话信息的函数。

    它有什么作用?

    它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞来固定(设置)另一个用户的会话 ID (SID)。通过这样做,他们将获得作为原始用户的完全访问权限,并能够执行原本需要身份验证的任务。

    为防止此类攻击,请在用户成功登录时(或为每个 X 请求)使用 session_regenerate_id() 为用户分配一个新的会话 ID。现在只有他拥有会话 ID,而您的旧(固定)会话 ID 不再有效。

    什么时候应该使用session_regenerate_id()?

    正如 symbecean 在下面的 cmets 中指出的那样,会话 ID 必须在身份验证状态的任何转换时更改,并且仅在身份验证转换时更改。

    进一步阅读:

    【讨论】:

    • 如果黑客进行第 20 次调用,会附加什么?会话 ID 已更改,他是唯一拥有该会话的人 ;))
    • @fred727 如果黑客有幸打了第 20 次电话,那么用户将拥有无效的 id 并且不再被验证。无需重新生成,黑客和用户都将通过身份验证。
    • 在会话中存储敏感信息时调用 session_regenerate_id 可能也很有用(因此不仅在身份验证时)
    • 如果会话信息不在 cookie 中,是否可以固定会话?我将会话信息存储在服务器中的文件中,是否需要重新生成 id?
    • “固定(设置)另一个用户的会话 ID(SID)”.... 这应该替换为“固定(设置)一个会话 ID( SID)在另一个用户的计算机上,然后在他验证后使用它”
    【解决方案3】:

    您可以使用它来提高安全性。

    通过这种方式,您可以创建一次性使用的会话 ID。

    假设您的用户会话 ID = 3

    一些黑客入侵了您的客户端并获取了他们的 session_id。所以黑客可以使用该 cookie 来使用他们的会话。

    如果你有类似的代码

    session_start();
    session_regenerate_id();
    

    您可以在他们每次使用您的网站时更改他们的会话。

    现在黑客得到 sessionid = 3

    但是你在他使用之后改变了会话,所以你的

    user has sessionid=4 // auth

    hacker have session=3 // null

    但是有一点可以说您正在使用 regenerate 方法,而您的客户端只需登录网站并关闭浏览器或处于非活动状态。您的客户端有 sessionid=4,如果黑客在该部分获取 cookie,他们将具有相同的 sessionid。

    如上所述,您可以通过一种方式保护您的客户端免受数据嗅探,但它仍然不能永久解决此问题。

    但如果您使用 SSL enc,它会非常安全。

    抱歉英语不好。

    【讨论】:

      【解决方案4】:

      一个简单的用例:

      // User visits a webshop
      $shopcart = new Cart();
      

      一个会话被启动并在数据库中创建一个条目。用户的购物车由他的会话 id 标识。

      // User orders items
      $shopcart->add('123', 20);
      $shopcart->add('124', 18);
      $shopcart->add('127', 5);
      

      对于添加的每个产品,都会在我的购物车表中创建一个记录。也由会话 ID 标识。

      // User saves cart in order to use it later
      $shopcart->save();
      

      用户决定保存他的购物车。它现在被附加到他的用户 ID 上。

      // Regenerate session id for user to be able to make a new cart
      session_regenerate_id();
      

      会话 ID 被重新生成,用户现在可以重新开始创建另一个购物车。

      【讨论】:

        【解决方案5】:

        我认为会话中毒的问题已经很好地解决了。

        回答“我应该什么时候使用它?”部分,重要的是退后一步并考虑您的应用程序对会话所做的事情。或者,换句话说,这是您需要回答的关键安全问题

        如果有人掌握了本次会议,他们将获得什么?

        如果您所做的只是跟踪其他匿名数据(用户访问网站并使用它来跟踪他们的访问),那么没有理由重新生成会话。劫持者不会通过抢占该会话而获得任何有价值的东西。

        但是,许多网站都提供登录功能。登录会改变很多事情。我可以访问我的个人资料。我可以更改设置。所以劫机者可能想要我的帐户访问权限,特别是如果普通用户和管理员用户都使用会话来管理登录。因此,当人们访问我的站点并登录时,我会重新生成会话。它增加了一个额外的安全层,我的新登录用户不太可能被劫持。

        任何时候我们向会话添加关键数据时,您都应该考虑重新生成会话 ID。如果您需要强化您的应用程序以防止固定,那么随机重新生成可能很有用,但我永远不会在每个请求上重新生成。默认情况下,PHP 将会话存储在本地磁盘上的文件中。您正在添加大量磁盘 I/O 来缓解相对较小的攻击向量。如果您真的需要更高的安全性,我建议您使用完整的 HTTPS,而不是定期重新生成(HTTPS 使固定变得非常困难)。

        【讨论】:

        • HTTPS 不会改变任何固定。
        • 但它确实使嗅探攻击变得更加困难,这可以用来首先获取会话 ID。
        • @kelunik 我认为确实如此。 “可以将 SessionID 的值插入到 cookie 中来操纵服务器响应,拦截客户端和插入 Set-Cookie 参数的 Web 应用程序之间交换的包。”
        【解决方案6】:

        为什么要使用session_regenerate_id?

        你应该用它来阻止session fixation。

        什么时候应该使用session_regenerate_id?

        每当身份验证状态发生变化时,主要是登录和注销。

        示例

        Bob 坐在公共计算机前,通过浏览 stackoverflow.com,他在那里打开了一个新会话。会话 ID 保存在 cookie 中(带有 httpOnly 标志以防止通过 javascript 访问)。假设 Stack Overflow 始终启用 HTTPS,并且为 cookie 设置了 secure 标志。

        我们现在如何窃取会话?

        Bob 记下会话 ID。他没有关闭浏览器就离开了电脑。现在 Alice 来到这台计算机前,发现 Stack Overflow 已经加载完毕。她现在登录。

        现在我们正处于您应该使用session_regenerate_id 的阶段。如果您在登录期间没有在此处创建新的会话 ID,Bob 可以使用他写下的上一个会话来访问 Alice 的会话,并且现在将以 Alice 的身份登录。

        【讨论】:

        • 但是直到session_regenerate_id()发出的那个时候,Alice才能访问bobs账号?对吗?
        • @akam - 来晚了,但值得回复...... 1. Bob 没有退出,Alice 可以使用他的登录名 - 2. Bob 退出,Alice 没有登录, Alice 可以使用他的会话 ID,但是没有活动登录来访问他的数据 - 3. Bob 注销,Alice 登录,Bob 使用会话 ID,有一个活动登录,Bob 访问 Alice 的数据。但具体来说:依赖于脚本的安全性,会话 ID 并不一定意味着您可以访问已注销用户的数据,但通常来说这是一种可能且风险很高的情况。
        【解决方案7】:

        session_regenerate_id():无法重新生成会话 ID - 会话不是 活跃

        if(session_status() == PHP_SESSION_ACTIVE)
        {
            session_regenerate_id();
        }
        

        【讨论】:

          猜你喜欢
          • 2011-06-07
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          • 2018-11-12
          • 2015-08-24
          • 2013-05-10
          • 2023-03-08
          • 2013-01-29
          相关资源
          最近更新 更多