【问题标题】:PHP session files permissionPHP会话文件权限
【发布时间】:2013-01-21 09:02:40
【问题描述】:

我想使用session_id($id) 将会话替换为现有的。我将会话目录移动到/tmp/php_sess,并为该文件夹设置了 777 权限。

但是 PHP 在具有权限的文件夹中创建会话文件:

-rw-------

另一个脚本(来自 CLI)无法读取它。如何告诉 PHP 以所有人的权限创建文件(777)?

【问题讨论】:

  • 你不应该让任何人阅读用户的会话。
  • 我需要这样做才能运行 cli 脚本,它将读取会话。

标签: php chmod


【解决方案1】:

我找到了一些解决方案。 PHP创建会话时,可以设置文件的权限。

session_start();
$path = session_save_path().'/sess_'.session_id();
chmod($path, 0777);

【讨论】:

    【解决方案2】:

    您可以设置incron 来监视目录并在创建文件时将其更改为 777。不漂亮,但有效。配置看起来像:

    /tmp/php_sess IN_CREATE chmod 777 $@/$#
    

    这必须在根 incron 配置中,以便以根权限执行命令。有关配置选项的更多信息here

    【讨论】:

    • 为什么投反对票?我确实认为这会起作用并且完全符合要求。我错了吗?
    【解决方案3】:

    我认为这是XY problem 的一个实例。我将尝试解决核心问题和您尝试的解决方案。

    尝试的解决方案 (Y)

    更改会话文件的权限。

    在更改会话文件的模式之前三思而后行,注意相关的安全隐患。但是既然你问了,我们就假设你知道自己在做什么。

    您有三个选择:

    1. 创建后对会话文件进行 Chmod

      session_start();
      $path = session_save_path() . '/sess_' . session_id();
      chmod($path, 0640);
      

      这就是你在your answer 中所做的。一个严重的问题是 您必须在对 session_start() 的任何调用之后添加 chmod 调用,即使它是在 PEAR 模块或任何其他第三方代码中完成的。这是维护的噩梦。

    2. session.save_path中设置模式
      最好在php.ini.htaccess 中(通过php_value session.save_path …),但如果您无权访问其中任何一个,您可以直接从PHP 中使用ini_set(),在脚本开头附近的某个位置:

      ini_set('session.save_path', '0;640;' . session_save_path());
      

      从这三个中,我会选择这个,因为它很好地平衡了复杂性和简洁性

    3. 实现您自己的会话存储
      您可以随心所欲地实施会话。在您的代码中,您可以确保创建具有正确权限的文件。
      想象一下这里有很多代码。即一个实现SessionHandlerInterface 的类,并在脚本开头附近的某个地方调用set_session_save_handler

    选择模式 640 假设创建会话的脚本和 CLI 脚本由同一组中的用户运行,并且 CLI 脚本只需要读取权限。如果不是这种情况,请使用 644(所有人都可以读取)、660(组可以读取和写入,其他人不能)或 666(所有人都可以读取和写入)。关注principle of least privilege。请注意,流程umask 可能会阻碍您的努力——您可以先更改它,例如。 G。通过umask(0022)

    实际问题(X)

    使 CLI 脚本工作。

    如果您在拥有会话文件的同一用户下运行 CLI 脚本,则无需更改其模式。模式 600 保证会话文件内容的安全。

    如果您需要能够从另一个用户的帐户执行脚本,您可能需要 setuidsudo,但请确保不要创建与使用时相同的安全漏洞高于 600 模式。

    当 CLI 脚本确实需要在与创建会话的用户不同的用户下运行时,尝试的解决方案(更改会话文件的模式)实际上可能是正确的做法。我知道一个网站的脚本由多个用户编辑,都在同一个组中。每个 PHP 脚本都在其所有者下通过suphp 执行。如果一个脚本创建了一个会话文件,其他用户创建(因此拥有)的脚本就不能使用它。使会话工作所需的权限是 660,它仍然是一个相当安全的设置。保留 600 模式并在专用的人工用户下运行服务器和所有脚本会更好。


    此答案的earlier version 比较了解决方案并详细提到了它们的优缺点。它还讨论了适当模式的选择。它的冗长让我有一种清理它的冲动,只留下最重要的部分。不过,您可能仍然会发现它很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 2015-05-23
      • 2012-01-11
      • 1970-01-01
      • 2011-04-21
      • 2014-10-26
      • 1970-01-01
      相关资源
      最近更新 更多