【问题标题】:how can I create a file with file_put_contents that has group write permissions?如何使用具有组写入权限的 file_put_contents 创建文件?
【发布时间】:2010-11-17 10:09:41
【问题描述】:

我正在使用file_put_contents 创建一个文件。我的 php 进程在一个有权写入目录的组中运行。但是,当调用 file_put_contents 时,生成的文件没有组写入权限(它第一次创建就很好)。这意味着如果我尝试覆盖文件,它会因为缺少权限而失败。

有没有办法创建具有组写权限的文件?

【问题讨论】:

    标签: php linux nginx


    【解决方案1】:

    示例 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分别为所有者、组和其他可写。

    【讨论】:

    • 请注意,这会引发 TOCTOU 攻击。正在创建的文件和更改权限之间有一个小的差距。使文件在之间可读
    • @JonasLejon 如果唯一的目标是添加额外的权限,那么这里不应该有任何关于 TOCTOU 的漏洞,对吧?如果您试图以这种方式保护它并删除权限,那么如果我正确理解这个问题,那么可能存在瞬间漏洞。如果我不正确并且它确实以某种方式暴露了不存在的可读性,那么我想,如果敏感,您可以将文件创建为空,然后更改权限,然后附加数据。
    【解决方案2】:

    您可能会在调用 file_put_contents 之前尝试设置 umask :它将更改创建文件时将授予的默认权限。

    另一种方法(根据文档更好)是在创建文件后使用chmod 更改权限。


    嗯,在重新阅读问题后,我希望我能很好地理解它......

    【讨论】:

      【解决方案3】:

      要打开文件并覆盖内容,您需要对该文件的写入权限。了解区别很重要。要覆盖整个文件,您实际上需要对 目录 的写入权限。

      如果您想明确说明,请使用chmod() 设置适合文件和/或目录的内容。

      【讨论】:

      • 嗯...我确实有权访问该目录,问题是我想从同一个文件的不同脚本中多次调用 file_put_contents,但连续多次失败。
      猜你喜欢
      • 2010-10-08
      • 2014-11-01
      • 2021-01-17
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2013-10-30
      相关资源
      最近更新 更多