文件权限和CHMOD:如何在PHP中创建文件时设置777?

16

当保存一个不存在的文件时,关于文件权限的问题。

目前看来一切进展顺利,保存的文件似乎具有模式644

我需要做什么改变,才能让文件保存为模式777

非常感谢任何提示、线索或答案。我认为与此相关的代码已经包含在内:

/* write to file */

   self::writeFileContent($path, $value);

/* Write content to file
* @param string $file   Save content to which file
* @param string $content    String that needs to be written to the file
* @return bool
*/

private function writeFileContent($file, $content){
    $fp = fopen($file, 'w');
    fwrite($fp, $content);
    fclose($fp);
    return true;
}

3
请注意,0777权限模式是危险的。请参考https://dev59.com/oHE95IYBdhLWcg3wXsyR。 - user212218
@Phoenix 谢谢。我想0766应该足够了(需要允许所有写入权限)。这样好吗? - Sam
1
0766更好,这将防止任意代码执行。文件是否需要可写入world,或者仅Apache可以写入就足够了?您是否有一组需要能够编写这些文件的应用程序?如果让它们作为同一组运行并设置为0764模式会怎样呢? - user212218
1
不是真的,危险的是写入位,而不是执行 :-) 我想问一下,为什么您认为它必须是全局可写的。 - paxdiablo
飞行@Phoenix 谢谢!确实,在这种情况下,它需要是全局可写的。取消执行位可以解决我的夜间出汗问题 wwwwiiiuieuuewuwuuuwww :) 关于那个组的好点子。我会检查一下并做出最终决定。 - Sam
3个回答

34

PHP内置了一个名为bool chmod(string $filename, int $mode )的函数。

http://php.net/function.chmod

private function writeFileContent($file, $content){
    $fp = fopen($file, 'w');
    fwrite($fp, $content);
    fclose($fp);
    chmod($file, 0777);  //changed to add the zero
    return true;
}

12
不要使用777,它是一个十进制数,与你想要的完全不同 :-) - paxdiablo
这是一个安全风险吗?如果文件权限为777,则攻击者可以使用“PUT”方法将文件上传到系统中?我错了吗?根据您的答案,我将使用您的解决方案。 - Hasan
@Hasan 可能会有某种身份验证系统来验证发出请求的用户是否具有执行具有这些权限的脚本的必要权限。 话虽如此,在所有软件开发案例中都值得注意最小特权原则,但从技术上讲,这不是 OP 在这里所要求的 :). 此外,我认为方法在这里根本没有起作用。 理论上,如果设计了这样的内容,对脚本的 GET 请求可能会触发类似的操作。 - thescientist

7

您只需要使用chmod()手动设置所需的权限:

private function writeFileContent($file, $content){
    $fp = fopen($file, 'w');
    fwrite($fp, $content);
    fclose($fp);

    // Set perms with chmod()
    chmod($file, 0777);
    return true;
}

2
请看我的评论,正确的掩码是 0777 而不是 777。 - paxdiablo
1
@paxdiablo 更改已完成。我整天都在Unix命令行上工作,习惯于省略一些特殊部分。 - Michael Berkowski

2
如果您想要更改现有文件的权限,请使用chmod(更改模式)函数:chmod
$itWorked = chmod ("/yourdir/yourfile", 0777);

如果您想让所有新文件都具有特定的权限,则需要设置您的umode。这是一个进程设置,可以将默认修改应用于标准模式。
它是一种减法运算。也就是说,umode022将给您一个默认权限为755777-022=755)。
但是,您应该非常仔细地考虑这两个选项。使用该模式创建的文件将完全没有受到更改的保护。

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