我想使用session_id($id)
替换现有会话。我将会话目录移动到/tmp/php_sess
,并为该文件夹设置了777权限。
但PHP在该文件夹中创建了具有权限的会话文件:
-rw-------
另一个脚本(来自CLI)无法读取它。如何告诉PHP创建具有每个人权限的文件( 777 )?
答案 0 :(得分:2)
我认为这是XY problem的一个实例。我将尝试解决核心问题和您尝试的解决方案。
更改会话文件的权限。
在更改会话文件模式之前请三思而后行,请注意相关的安全隐患。但既然你问过,我们假设你知道你在做什么。
您有三种选择:
在创建后chmod会话文件
session_start();
$path = session_save_path() . '/sess_' . session_id();
chmod($path, 0640);
这是你在your answer中所做的。一个严重的问题是,您必须在调用chmod
后添加session_start()
来电,即使是在PEAR模块或任何其他第三方代码内完成。这是一场维护噩梦。
在session.save_path
中设置模式
最好是在php.ini
或.htaccess
(通过php_value session.save_path …
),但如果您无法访问其中任何一个,则可以直接从PHP使用ini_set()
,在某处附近脚本的开头:
ini_set('session.save_path', '0;640;' . session_save_path());
从这三个中,我会选择这个,因为它很好地平衡了复杂性和清洁度。
实施您自己的会话存储空间
您可以随意实施会话。在您的代码中,您可以确保使用正确的权限创建文件
想象一下这里有很多代码。即在您的脚本开头附近的某个地方实施SessionHandlerInterface
和调用set_session_save_handler
的类。
模式640的选择假设创建会话的脚本和CLI脚本由同一组中的用户运行,并且CLI脚本只需要读取访问权限。如果不是这种情况,请使用644(所有可以读取),660(组可以读取和写入,其他人可以不读),或666(所有可以读取和写入)。关注principle of least privilege。请注意,进程umask可能会阻碍您的努力 - 您可以先更改它,e。 G。通过umask(0022)
。
使CLI脚本正常工作。
如果您在拥有会话文件的同一用户下运行CLI脚本,则无需更改其模式。模式600保持会话文件的内容安全。
如果您需要能够从其他用户的帐户执行该脚本,您可能需要 setuid或sudo ,但请确保不要创建相同的安全性使用高于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)