会话字段中的信息存储在哪里?例如,如果我在会话中存储类似$_SESSION['foo'] = 'bar'
. “酒吧”存储在哪里?
如果我存储一个类的对象,它以哪种方式存储?喜欢$_SESSION['kart'] = new Kart(10)
。有人可以获取存储在该类中的信息吗?如何?
该会话的合法所有者可以修改字段“foo”的值吗?
而且,有人可以在其他用户已经创建的会话中更改字段“foo”的值吗?
会话字段中的信息存储在哪里?例如,如果我在会话中存储类似$_SESSION['foo'] = 'bar'
. “酒吧”存储在哪里?
如果我存储一个类的对象,它以哪种方式存储?喜欢$_SESSION['kart'] = new Kart(10)
。有人可以获取存储在该类中的信息吗?如何?
该会话的合法所有者可以修改字段“foo”的值吗?
而且,有人可以在其他用户已经创建的会话中更改字段“foo”的值吗?
这取决于使用的网络服务器。如果我们以 Unix 上的 PHP 为例,它可能会将会话存储在文件系统的 /tmp 文件夹中。它在此处创建一个文件,其中用户会话 ID 的名称以 sess_ 为前缀(例如:/tmp/sess_9gk8f055hd61qll6a8pjpje2n2)。会话的内容可以选择在放置到浏览器之前进行加密。对于 Apache 会话(不一定是 PHP),您可以使用 mod_session_crypto 模块(在此处阅读更多内容)。
会话的所有者不能随意更改会话变量,除非应用程序允许他这样做。应用程序逻辑必须提供更改会话的方法,以便用户更改变量。
会话对象永远不会被传输到客户端,只有对会话的引用(例如 PHPSESSID)被传递给客户端。会话 ID 应该具有高熵和至少 16 个字节的长度,以便很难猜到。有关更多信息,请参阅OWASP Top 10 - Broken authentication and session management 。有关如何保护会话的具体信息,另请参阅此OWASP 备忘单。
对会话存储的攻击:
如果存在诸如 LFI(本地文件包含)之类的缺陷,攻击者可能会通过将文件包含在文件系统中来读取他们自己和其他用户的会话对象。例如,如果以下示例有效,我可能会读取我自己的会话数据:
http://<victim>/?page=../../../../../../../../tmp/sess_<my sessionid>