代码之家  ›  专栏  ›  技术社区  ›  eflorico

在会话中存储什么?

  •  6
  • eflorico  · 技术社区  · 15 年前

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

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

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

    4 回复  |  直到 10 年前
        1
  •  2
  •   rook    15 年前

    简短的答案是$u会话是 安全的 您不必担心它的内容被泄露给用户或攻击者。

    会议内容 不是 通常用户可以访问。您应该能够存储用户的主键,这样就可以了。在正常的Linux系统中,会话文件夹位于/tmp中,但在php.ini中可以将其更改为web根目录(/var/www/tmp),然后可以访问会话。唯一的另一种方法是,如果用户能够通过劫持对eval()的调用或通过正常打印的变量访问$\u session super global。

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

        2
  •  4
  •   Matthew Flaschen    15 年前

    你说得对。客户端只看到随机生成的会话ID令牌。有一些方法可以滥用这个令牌(劫持等),但在上面有一个guid不会增加任何内容。相比之下,选择 session.cookie_httponly (javascript看不到会话cookie) session.cookie_secure (cookie只能通过https传输)防止某些攻击场景。

        3
  •  1
  •   webbiedave    15 年前

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

    这只是增加了一件想成为劫机犯的事情。但是,它可能是一种错误的安全感,因为如果涉及嗅探,它几乎不保护会话,因为新的cookie与php会话cookie一起发送。而且,会话ID是很难猜测的(我相信你知道,只是不要把它放在URL中,而是放在cookie中)。

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

        4
  •  1
  •   zombat    15 年前

    我从来没有见过guid用于会话,但是我看到了一些额外的方法,它们确实增加了一点安全性。

    • 存储用户的IP-如果需要根据位置强制更改会话(有时geoip的东西会这样做)
    • 存储用户的http_user_agent头字符串。如果劫机者恰好使用不同的浏览器,可以提供一点安全防范劫机。

    有一篇关于 session hijacking countermeasures 实际上,在维基百科上。

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