【问题标题】: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
          相关资源
          最近更新 更多