【问题标题】:Saving session data securely in PHP在 PHP 中安全地保存会话数据
【发布时间】:2011-03-15 19:42:11
【问题描述】:

我试图了解会话在 PHP 中的工作方式,发现会话数据默认存储在文件系统中。在共享主机环境中,任何用户编写的 PHP 脚本都可以读取会话数据。如何预防?

【问题讨论】:

  • 可以为每个虚拟主机指定不同的保存路径。因此,不一定每个用户都可以访问该目录。
  • @Gumbo 是的,有一个警告——如果 PHP 使用 web 服务器的 uid 运行,则无法阻止虚拟主机 a 访问虚拟主机 b 会话数据。
  • @Artefacto,我同意。我相信在共享主机下,PHP 仍然作为每个主机帐户的同一用户运行。这是内置的安全漏洞,只有覆盖基于文件的处理程序才能治愈。对吗?
  • @Mike 这取决于,但许多确实在 Web 服务器 uid 下运行。覆盖基于文件的处理程序对您没有多大帮助,您仍然可以读取其他用户脚本并按照他的方式获取数据。
  • @Artefacto,但他只能按照其他用户脚本的预期工作方式读取其他用户脚本。

标签: php security session tmp


【解决方案1】:

使用 session_save_path() 并更改您的会话文件夹,如“/htdocs/storage/sessions”。现在会话只保存到您给定的路径。

【讨论】:

    【解决方案2】:

    您可以使用session_save_path() 将会话数据目录更改为非共享目录。

    【讨论】:

    • 如果我错了,请纠正我,但是无论您将目录更改为仍然需要用户读取和写入 PHP 运行的用户,因此在技术上仍然可以被共享的其他用户读取托管?
    • 共享主机通常会将您锁定为只能读取位于您帐户中的目录和文件。
    • 这是真的。但如果这是真的,那么任何其他目录(您的 webroot、包含脚本的目录等)也将被其他用户读写。除非其他用户都能够控制您的网站(以及彼此的),否则我们必须得出结论,任何明智的托管服务提供商都实施了一种方法来限制用户对其他用户拥有的目录的控制。
    • 这就是他们发明open_basedir的原因
    【解决方案3】:

    编写您自己的 SESSION 包装器。

    例如 CodeIgniter 的session library doe 不依赖于 PHP 的原生,而且更安全:

    注意:Session 类不使用原生 PHP 会话。它生成自己的会话数据,为开发人员提供更大的灵活性。

    【讨论】:

      【解决方案4】:

      取决于您对 php.ini 文件的访问级别 - 如果您在运行 suPHP 并允许您拥有自己的 php.ini 文件(例如)的共享主机环境中,那么您可以简单地设置session.save_path 到 ~/tmp 之类的路径,而不是通常共享的 /tmp。

      首先,我认为您实际上不能从其他应用程序读取 php 会话数据。我相信这对于观看它的人来说是相当独特的。

      最后php Session 数据不只是文件系统保存而已。它也可以设置为保存在用户机器上的cookie中,或者您可以设置php会话数据存储在数据库中。

      【讨论】:

      • 不幸的是,其他会话的会话数据很容易从文件系统中读取: $sessionFileDirectory = ini_get('session.save_path'); echo '

        '.$sessionFileDirectory.'

        '; foreach (glob('/xampp/tmp/sess_*') as $sessionFileName) { echo '

        '.$sessionFileName.'

        '; $serializedSessionData = file_get_contents($sessionFileName); var_dump($serializedSessionData);回声'
        ';并且自定义会话处理程序是解决此问题的最佳方法
      • 我想我设置默认系统更安全,因为我无法在我的设置中模拟它。 tmp/ 中的文件归运行 php 的帐户所有,并以 0640 保存,因此 sess_xxx 归“marco”“marco”所有,而其他文件归“user”“user”所有。 suPHP 确实有助于解决所有那些讨厌的无人问津的问题。
      【解决方案5】:

      您可以覆盖脚本的会话保存处理程序以使用文件系统以外的东西,例如数据库或内存缓存。下面是一个详细的实现:http://phpsec.org/projects/guide/5.html

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 2017-08-12
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2016-07-05
        • 1970-01-01
        相关资源
        最近更新 更多