【发布时间】:2011-02-12 13:34:56
【问题描述】:
我知道会话固定和劫持的所有问题。我的问题非常基本:我想用 PHP 创建一个身份验证系统。为此,登录后,我只需将用户 ID 存储在会话中。
但是:我见过一些人做一些奇怪的事情,比如为每个用户和会话生成一个 GUID 并将其存储,而不仅仅是会话中的用户 ID。为什么?
客户端无法获取会话的内容 - 或者可以吗?
【问题讨论】:
我知道会话固定和劫持的所有问题。我的问题非常基本:我想用 PHP 创建一个身份验证系统。为此,登录后,我只需将用户 ID 存储在会话中。
但是:我见过一些人做一些奇怪的事情,比如为每个用户和会话生成一个 GUID 并将其存储,而不仅仅是会话中的用户 ID。为什么?
客户端无法获取会话的内容 - 或者可以吗?
【问题讨论】:
简短的回答是 $_SESSION 是安全的,您无需担心其内容会泄露给用户或攻击者。
会话的内容不是用户通常可以访问。你应该能够存储用户的主键,你会没事的。在某些情况下会话可能会泄露,在普通的 linux 系统上,会话文件夹位于 /tmp 中,但是可以在 php.ini 中将其更改为 Web 根目录 (/var/www/tmp),然后就可以访问了.唯一的另一种方法是,如果用户能够通过劫持对 eval() 的调用或通过正常打印的变量来访问 $_SESSION 超级全局变量。
如果您在共享主机上运行并使用旧版本的 PHP 和/或您的服务器配置错误,则此系统上的其他用户可能会读取甚至修改存储在 /tmp/ 中的会话文件。我不知道有哪个应用程序会考虑这种攻击。如果这是一个问题,您可以将信息存储在数据库中的session 表中。
【讨论】:
我从未见过将 GUID 用于会话,但我见过一些额外的方法确实可以增加一点安全性。
实际上,在 Wikipedia 上有一篇关于 session hijacking countermeasures 的精彩文章。
话虽如此,我想任何将 GUID 存储为会话的一部分以用于会话安全的人都可能看不到更好的解决方案(例如会话重新生成)。我可以看到要存储的 GUID 的其他用途(也许它是游戏随机生成器的一部分),但不能用于会话安全。
【讨论】:
有时,为了增加安全性,开发人员可能会为用户的会话分配一个长字符串,以使劫持更加困难。通过在创建会话时使用此新字符串设置 cookie,应用程序可以在后续请求中检查正确的字符串,以更好地确保它是实际登录的人。
这只是增加了一个想要劫机者必须猜测的东西。但是,这可能是一种错误的安全感,因为如果涉及嗅探,它几乎不会保护会话,因为新的 cookie 是与 php 会话 cookie 一起发送的。此外,会话 ID 很难猜测(我相信您知道,只是不要将其放在 url 中,而是放在 cookie 中)。
会话信息存储在硬盘上,因此客户端在没有应用程序干预的情况下无法获取。
【讨论】:
你是对的。客户端只会看到一个随机生成的会话 ID 令牌。有一些方法可以滥用此令牌(劫持等),但顶部有 GUID 不会增加任何内容。相比之下,session.cookie_httponly(JavaScript 看不到会话 cookie)session.cookie_secure(Cookie 只能通过 HTTPS 传输)等选项可以防止某些攻击场景。
【讨论】: