PHP mkdir() chmod和权限

10
我正在使用这个基本脚本:

$folderPath = "../path/to/$folder/";
mkdir("$folderPath");

我创建了这个目录,然后上传照片到它里面。我已经这样做了4-5个月了,但突然间,当我尝试通过Web浏览器查看文件夹内容时,我开始收到“FORBIDDEN”错误。
目录创建方式和照片上传没有问题,但我无法访问照片。
我尝试重写脚本并使用chmod更改权限,但完全没有成功。
所有旧目录都是以“-w- rwx r-x r-x”创建的,但我无法重新创建它。
我尝试在我的脚本中添加chmod行:
$folderPath = "../sales/inventory/$folder/";
mkdir("$folderPath");
chmod("$folderPath", 0755);

但是我无法重现相同的权限,我正在尝试理解chmod的工作原理,但我无法弄清楚如何使这个非常基本的功能再次正常工作。


3
只翻译文本内容,不进行解释:如果你想得到别人的帮助,就要接受一些答案。 - Galen
这段代码让我有点不安,你是否对$folder进行了消毒/过滤?如果没有,那就是我为什么认为它停止的原因之一,可能存在安全漏洞。 - Jim
这不是完整的脚本,我在$文件夹上有过滤器。 - Thomas
只是检查一下,因为那可能是一个问题(或者说是问题的根源)。您检查了照片的实际权限吗?如果您可以访问该文件夹,则其中一部分是它,但照片也需要适当的权限。 - Jim
听起来像是提供者的问题,安全模式不太可能,配额,或者可能是fastcgi+suexec,可以在serverfault上询问;呈现的代码不是原因。 - mario
chmod()返回什么?如果权限设置错误,PHP可能无法更改权限;这将导致chmod()调用返回FALSE。服务器是否运行Unix类型的操作系统?如果是,并且您具有shell或(S)FTP访问权限,请执行带有权限的目录列表并向我们显示输出。(在shell中,在目录内部执行ls -la命令。) - mr. w
4个回答

13

尝试查找一个HTAccess文件,其中将提到“Options -Indexes”选项,因为这通常用于在Web浏览器中不显示文件夹的内容。需要按照以下方式搜索该文件:

  • 在文件夹“root_folder/sales/inventory/$folder/”中,其中“$folder”如您的代码所述。
  • 如果未找到,请尝试在文件夹“root_folder/sales/inventory/”中查找。
  • 如果未找到,请尝试在文件夹“root_folder/sales/”中查找。
  • 如果未找到,请尝试在文件夹“root_folder/”中查找。

当您获得在HTAccess文件中编写“Options -Indexes”的代码后,您可以从那里删除/注释掉该行代码,也可以在所需的“$folder”文件夹中编写另一个HTAccess文件,其中代码将为“Options Indexes”。

此外,在PHP页面中,逻辑必须如下:

<?php
$folderPath = "../sales/inventory/$folder/";
mkdir("$folderPath");
chmod("$folderPath", 0755);

// Use of "copy()" / "move_uploaded_file()" function here, using some "$targetFile" variable.
chmod($targetFile, 0755);
?>

当你需要取消链接或删除从"$folder"文件夹中上传的文件时,这将对你有所帮助。

希望能对你有所帮助。


谢谢您的帮助,这确实有所帮助,但我仍然遇到了一个问题,就是实际权限没有反映出我在脚本中输入的内容。例如,您的示例运行良好,但当我查看目录树中的权限时,创建的$folder并不像预期的那样是rwx r-x r-x,而是变成了rwx r-x ---。 - Thomas
转念一想,我重新阅读了你说的话,可能错过了最后上传文件部分的chmod,我尝试将其添加到上传脚本中,它正常工作了。我非常感谢你的帮助,目前一切似乎都正常运行,只是我不明白为什么一开始会出问题。 - Thomas
@thomas - 这是一个常见的问题,当我自己还是新手时,我也犯过这个错误。所以不用担心,振作起来吧!祝你好运! - Knowledge Craving

8
如果您的$folder变量包含一些子目录,则父目录可能没有设置正确的权限。这是我在雇用OVH Gentoo服务器时遇到的问题。
假设您的 $folder = '/store1/ally23/shelf42';,因此您的最终目录结构为 ../sales/inventory/store1/ally23/shelf42,并且您想要 0777 的权限。 您可以执行以下操作:
mkdir($folderPath, 0777, true) || chmod($folderPath, 0777);

只有最终目录shelf42被设置为0777。中间目录使用默认权限创建(在我的情况下是0744)。

PHP的chmod命令没有递归选项,因此您必须循环遍历中间目录并单独对它们进行chmod。


2
如果您在共享环境中,上传后可能还需要进行chown操作,以确保安全。特别是如果您的Web服务器在一个与虚拟主机权限不同的用户下运行(例如“nobody”与“mysite”),这种情况在cPanel服务器上很常见。

0

简单来说,umask 意味着新文件/目录的默认权限:

<?php
 umask(022);
?>

这将分别为用户、组和其他人设置默认权限:

  • 0 - 读、写和执行
  • 1 - 读和写
  • 2 - 读和执行
  • 3 - 只读
  • 4 - 写和执行
  • 5 - 只写
  • 6 - 只执行
  • 7 - 没有权限

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