Php mkdir的权限已赢得';行不通

Php mkdir的权限已赢得';行不通,php,linux,Php,Linux,我不明白为什么我必须使用chmod来获得正确的权限。。 文件创建成功,但使用了我在mkdir中指定的0755而不是0775 () 我必须在mkdir之后执行chmod来设置正确的权限 php.ini中的安全模式已关闭,文件夹属于php的组和所有者(www-data) 这不起作用: if(!is_dir("/var/www/customers/$username/$project_name")) { mkdir("/var/www/customers/$username/$pro

我不明白为什么我必须使用
chmod
来获得正确的权限。。 文件创建成功,但使用了我在
mkdir
中指定的0755而不是0775

()

我必须在
mkdir
之后执行
chmod
来设置正确的权限

php.ini中的安全模式已关闭,文件夹属于php的组和所有者(www-data)

这不起作用:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name",0775);

  }
但这确实:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name");
    chmod("/var/www/customers/$username/$project_name",0775);

  }

是的,是因为乌马斯克

从文档注释中:

您可能会注意到,当您创建 使用以下代码的新目录:

mkdir($dir,0777)

所创建的文件夹实际上具有 权限为0755,而不是 明确规定 777你为什么问这个?因为umask():

umask的默认值,至少 根据我的设置,我的年龄是18岁。也就是22八进制, 或 22这意味着使用mkdir()将创建的文件夹CHMOD为 0777,PHP接受0777并进行减法运算 umask的当前价值,以我们的 案例0022,因此结果为0755- 这不是你想要的, 可能吧

对此的“修复”很简单,包括 这一行:

$old_umask=umask(0)

在使用创建文件夹之前 mkdir()以获得您需要的实际值 将put用作CHMOD。如果你愿意 希望将umask恢复到原来的状态 值完成后,请使用以下命令:

乌马斯克(old_umask)


我想您可能需要修改您的umask

如mkdir手册页所述:

该模式也由当前umask修改,您可以使用umask()更改该模式

现在,看看umask()手册页,其中一条评论证实了我的内心想法:

“最好在创建文件后使用chmod()更改文件权限。”

换句话说,我相信你这样做更安全:

设置您的umask,以便为您的用户创建私有文件,然后使用chmod将其打开


在创建目录之前,请尝试调用此函数:clearstatcache();另外,如果您向其他用户发送消息,您可能应该检查是否可以仅使用mkdir来执行此操作。

所以chmod不受umask的影响?不。。。仅当您创建受umask影响的文件夹/文件时。澄清一下,在共享服务器上,创建后使用chmod绝对不安全。有人可以隐藏一个小脚本来接收新创建的文件的通知,这些文件具有常见的名称,如LocalSettings,并在创建文件时抓取文件句柄;然后,他可以阅读它,即使它是chmoded和您添加您的密码数据在那里。这与大多数主机设置无关,但在UNIX上,出于习惯,您应该始终使用您想要的权限创建文件。@Nicholas我注意到关于文件创建权限的主题存在矛盾的信息。在我看来,当您想授予额外的权限而不是删除它们时,在创建文件后chmod()是合理或安全的。例如,将umask设置为0077,然后对随后创建的文件进行chmoding是完全安全的。创建文件并随后删除权限是存在(非常小的)安全风险的场景。我认为攻击者在两次函数调用之间获得新创建文件的文件句柄的几率非常非常低。