PHP session cookie 和存储中的 ID

PHP session id in cookie and storage

我阅读了多条关于加密 PHP session 数据的评论,以防它存储在共享服务器上多个帐户可用的临时目录中。但是,即使 数据 已加密,session_start() 仍会生成包含 session_id 的文件名。例如,

sess_uivrkk2c5ksnv2hnt5rc8tvgi5

,其中 uivrkk2c5ksnv2hnt5rc8tvgi5 与我在浏览器收到的 cookie 中找到的 session id 相同。

这个问题通常是如何解决的/有人可以给我举个例子吗?我发现的所有简单示例都只涉及加密数据,而不是更改文件名。

只是为了看看会发生什么,我制作了一个 SessionHandler 包装器,它会在将 $session_id 变量传递给它的 parent 函数之前对其进行 MD5 散列,但这没有用.相反,我最终得到了两个文件:一个空白文件(session_id 作为其名称的一部分)和一个完整文件(带有 MD5'ed session_id)。此外,还有一个问题是 close() 不接受 session_id 作为参数,所以我无法将它传递给它的 parent.

编辑:我正在了解 php sessions,这不适用于实时商业网站等。

是的,在某些情况下(即配置非常低效的服务器 - 尽管不幸的是这些确实存在)在共享服务器上,您的会话数据可能会被其他人读取。试图通过更改名称来隐藏会话文件没有任何用处 - 这被描述为 "Security through Obscurity"。去 Google 这个短语 - 它通常被描述为矛盾修饰法。

如果您的问题是如何防止其他客户在配置不当的服务器上访问您的会话数据,那么明智的选择(按优先级顺序)是:

  • 切换服务提供商
  • 使用自定义会话处理程序将数据存储在安全的地方(例如数据库)网络上有很多示例 - 质量参差不齐
  • 使用自定义会话处理程序来加密数据并使用文件存储。同样,您不需要自己编写代码 - 只需仔细检查任何候选人

如果您想知道您的提供商是否是罪魁祸首 - 只需查看 FILE 的值即可。看起来您是否可以访问根文件系统?编写一个脚本,尝试从您的主目录外部读取。如果你不能,那么供应商可能已经设置了一个 open_basedir 限制(有可能绕过这个 - Google 会再次告诉你如何)。