【问题标题】:What to store in a session?在会话中存储什么?
【发布时间】:2011-02-12 13:34:56
【问题描述】:

我知道会话固定和劫持的所有问题。我的问题非常基本:我想用 PHP 创建一个身份验证系统。为此,登录后,我只需将用户 ID 存储在会话中。

但是:我见过一些人做一些奇怪的事情,比如为每个用户和会话生成一个 GUID 并将其存储,而不仅仅是会话中的用户 ID。为什么?

客户端无法获取会话的内容 - 或者可以吗?

【问题讨论】:

    标签: php security session


    【解决方案1】:

    简短的回答是 $_SESSION 是安全的,您无需担心其内容会泄露给用户或攻击者。

    会话的内容不是用户通常可以访问。你应该能够存储用户的主键,你会没事的。在某些情况下会话可能会泄露,在普通的 linux 系统上,会话文件夹位于 /tmp 中,但是可以在 php.ini 中将其更改为 Web 根目录 (/var/www/tmp),然后就可以访问了.唯一的另一种方法是,如果用户能够通过劫持对 eval() 的调用或通过正常打印的变量来访问 $_SESSION 超级全局变量。

    如果您在共享主机上运行并使用旧版本的 PHP 和/或您的服务器配置错误,则此系统上的其他用户可能会读取甚至修改存储在 /tmp/ 中的会话文件。我不知道有哪个应用程序会考虑这种攻击。如果这是一个问题,您可以将信息存储在数据库中的session 表中。

    【讨论】:

      【解决方案2】:

      我从未见过将 GUID 用于会话,但我见过一些额外的方法确实可以增加一点安全性。

      • 存储用户的 IP - 如果您需要根据位置强制更改会话(有时 geoIP 会这样做)
      • 存储用户的 HTTP_USER_AGENT 标头字符串。如果劫持者碰巧使用不同的浏览器,可以提供一些安全性来防止劫持。

      实际上,在 Wikipedia 上有一篇关于 session hijacking countermeasures 的精彩文章。

      话虽如此,我想任何将 GUID 存储为会话的一部分以用于会话安全的人都可能看不到更好的解决方案(例如会话重新生成)。我可以看到要存储的 GUID 的其他用途(也许它是游戏随机生成器的一部分),但不能用于会话安全。

      【讨论】:

      • 补充一点,有些不幸的 ISP 的人经常更改他们的 IP 地址(有时每隔几分钟!),所以在会话中包装 ip 会导致太多麻烦。
      • @webbiedave - 是的,除非有很好的理由,否则我不会使用它。除非您愿意接受随之而来的问题,否则有很多理由不使用它。
      • HTTP_USER_AGENT 对任何攻击提供零保护,因为它是用户控制的变量。
      • @The Rook - 显然它是一个用户控制的变量,你会错误地依赖它。但是,您可以将其用作上次看到会话 ID 和这次之间发生变化的指标,并强制会话重新生成。 session id 也是一个用户控制的变量,但我没有看到你提到这一点。会话安全性是多层假设,如果不对整个传输进行加密,就无法获得真正的安全性。
      • 把显而易见的事情放在一边。我认为建议人们实施容易绕过的安全系统是有害的。也许您没有意识到欺骗这样的系统addons.mozilla.org/en-US/firefox/addon/59 是多么容易。还要记住,如果攻击者使用 xss 或嗅探线路,他们将能够在 http 标头中看到用户代理。
      【解决方案3】:

      有时,为了增加安全性,开发人员可能会为用户的会话分配一个长字符串,以使劫持更加困难。通过在创建会话时使用此新字符串设置 cookie,应用程序可以在后续请求中检查正确的字符串,以更好地确保它是实际登录的人。

      这只是增加了一个想要劫机者必须猜测的东西。但是,这可能是一种错误的安全感,因为如果涉及嗅探,它几乎不会保护会话,因为新的 cookie 是与 php 会话 cookie 一起发送的。此外,会话 ID 很难猜测(我相信您知道,只是不要将其放在 url 中,而是放在 cookie 中)。

      会话信息存储在硬盘上,因此客户端在没有应用程序干预的情况下无法获取。

      【讨论】:

      • 我不明白这应该如何提高安全性:如果黑客得到了别人的 HTTP 标头,他只会复制整个 Cookie 标头 - 然后他就走了。黑客应该如何在不嗅探的情况下获取会话 ID?
      • 这就是为什么我说“如果涉及嗅探,它几乎不会保护会话,因为新的 cookie 是与 php 会话 cookie 一起发送的。”我编辑添加了“虚假的安全感”来强调这一点。
      • @eWolf 在通过 GET 而不是通过 POST 发送会话的愚蠢场景中,您可以获得会话 id 而无需嗅探:当用户复制 URL 并将其粘贴到某处时,他已经放弃了他的会话ID。无论如何,这无关紧要。
      • 要添加到 eWolf,他们也可以尝试暴力破解。
      【解决方案4】:

      你是对的。客户端只会看到一个随机生成的会话 ID 令牌。有一些方法可以滥用此令牌(劫持等),但顶部有 GUID 不会增加任何内容。相比之下,session.cookie_httponly(JavaScript 看不到会话 cookie)session.cookie_secure(Cookie 只能通过 HTTPS 传输)等选项可以防止某些攻击场景。

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 2015-10-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-12-25
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多