PHP会话文件权限

时间:2013-02-06 08:17:12

标签: php chmod

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

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

-rw-------

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

3 个答案:

答案 0 :(得分:2)

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

尝试解决方案(Y)

更改会话文件的权限。

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

您有三种选择:

  1. 在创建后chmod会话文件

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

    这是你在your answer中所做的。一个严重的问题是,您必须在调用chmod 后添加session_start()来电,即使是在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的类。

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

    实际问题(X)

    使CLI脚本正常工作。

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

    如果您需要能够从其他用户的帐户执行该脚本,您可能需要 setuidsudo ,但请确保不要创建相同的安全性使用高于600模式时的孔。

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


    这个答案的earlier version比较了解决方案,并详细提到了它们的上下两侧。它还讨论了适当模式的选择。它的冗长让我觉得有必要清理它,只留下最重要的部分。不过,您可能仍然觉得它很有用。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可以设置incron来查看目录,并在创建文件chmod时将其设置为777.不是很好,但有效。配置看起来像:

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

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