如何使用file_put_contents创建一个具有组写权限的文件?

31
我正在使用file_put_contents来创建文件。我的php进程以能够写入该目录的权限组运行。然而,当调用file_put_contents时,生成的文件没有组写权限(第一次创建时可以正常进行)。这意味着,如果我尝试覆盖该文件,由于缺少权限而失败。
有没有一种方法可以创建带有组写权限的文件?
3个回答

40

示例 1(将文件权限设置为所有者和组的读写,其他人的只读):

file_put_contents($filename, $data);
chmod($filename, 0664);

示例2(使文件对组可写,而不改变其他权限):

file_put_contents($filename, $data);
chmod($filename, fileperms($filename) | 16);

示例3(使文件可被每个人写入而不更改其他权限):

file_put_contents($filename, $data);
chmod($filename, fileperms($filename) | 128 + 16 + 2);

128、16和2分别代表所有者、组和其他用户的可写属性。


1
请注意,这会导致 TOCTOU 攻击。在文件创建和更改权限之间存在一小段时间。这使得文件在此期间可读。 - Jonas Lejon
1
@JonasLejon 如果唯一的目标是添加额外的权限,那么在TOCTOU方面就不应该存在任何漏洞,对吧?如果您试图通过这种方式来保护它并删除权限,那么可能会存在一瞬间的漏洞,如果我正确理解了这个问题。如果我理解错误,并且它确实暴露了某些之前不存在的可读性,那么我想,如果敏感的话,您可以将文件创建为空,然后更改权限,最后追加数据。 - Eric

29
你可能需要在调用file_put_contents之前设置umask:这将更改创建文件时默认授予的权限。
另一种方法(根据文档更好)是在文件创建后立即使用chmod更改权限。
好的,在重新阅读问题后,我希望我理解得很好...

请务必在这里放入一个代码示例,配合您的三段文字。 - Philip

2

如果想要打开文件并覆盖内容,那么你需要对该文件具有写权限。理解这一区别非常重要。实际上,要完全覆盖整个文件,你需要对该 目录 具有写权限。

如果想要明确设置文件和/或目录的权限,请使用chmod()


1
嗯...我确实有目录权限,问题是我想从不同的脚本中多次调用file_put_contents写入同一个文件,但是后续的调用都失败了。 - Sean Clark Hess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接