【问题标题】:php mkdir() chmod and permissionsphp mkdir() chmod 和权限
【发布时间】:2011-04-15 11:09:30
【问题描述】:

我使用的是这个基本脚本:

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

我创建了这个目录,然后将照片上传到它。我已经这样做了 4-5 个月了,当我尝试通过网络浏览器查看文件夹的内容时,突然开始出现“禁止”错误

目录正在创建相同,照片仍在上传没有问题,但我无法访问照片

我尝试重写脚本并使用 chmod 更改权限,但我一点运气都没有

所有较旧的文件夹都是使用以下命令创建的:-w- rwx r-x r-x

我无法重新创建它

我尝试在脚本中添加 chmod 行:

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

但我无法重新创建相同的权限,我试图了解 chmod 的工作原理,但我不知道如何让这个非常基本的功能再次正常工作

【问题讨论】:

  • 如果您希望人们帮助您,请接受一些答案
  • 这段代码让我有点紧张,你在清理/过滤$folder吗?如果没有,那将是我对它停止的第一个猜测,一个潜在的安全漏洞。
  • 这不是我在 $folder 上有过滤器的整个脚本
  • 只是检查,因为这可能是一个(或那个)问题。您是否检查了照片的实际权限?就好像您可以访问该文件夹一样,这是其中的一部分,照片也需要适当的权限。
  • 听起来像是提供者的东西,安全模式不太可能,配额,或者可能是fastcgi + suexec,询问服务器故障;提供的代码不是原因

标签: php mkdir


【解决方案1】:

简单地说umask表示新文件/目录的默认权限:

<?php
 umask(022);
?>

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

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

【讨论】:

    【解决方案2】:

    如果您的 $folder 变量包含一些子目录,则您的父目录可能没有被更改为正确的权限。这是我在租用的 OVH Gentoo 服务器上遇到的问题。

    想象$folder = '/store1/ally23/shelf42'; 所以你的最终目录结构是 ../sales/inventory/store1/ally23/shelf42,你想要0777 权限。 你这样做:

    mkdir($folderPath, 0777, true) || chmod($folderPath, 0777);
    

    只有最终目录 shelf42 被 chmod 为 0777。中间目录是使用默认权限创建的(在我的例子中是0744)。

    PHP 的 chmod 命令中没有递归选项,因此您必须遍历中间目录并单独 chmod。

    【讨论】:

      【解决方案3】:

      如果您在共享环境中,为了安全起见,您可能还想在上传后chown。特别是如果您在虚拟主机以外的用户下运行您的网络服务器,该用户有权访问(例如:“nobody”与“mysite”。)这在 cPanel 服务器 FWIW 中很常见。

      【讨论】:

        【解决方案4】:

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

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

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

        同样在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 rx rx,而是作为 rwx rx ---
        • 转念一想,我刚刚重读了你所说的内容,我一定错过了最后上传文件部分的 chmod,我尝试将其添加到上传脚本中,它工作正常。我非常感谢您的帮助,一切似乎都正常,现在我只是不明白为什么这首先会崩溃
        • @thomas - 这是一个常见的部分,当我自己还是一个新生时,我也做错了。所以没有什么可担心的和振作起来! 祝你好运!!!
        猜你喜欢
        • 2020-07-12
        • 2015-01-18
        • 2010-10-18
        • 2011-03-08
        • 2011-12-14
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 2018-06-09
        相关资源
        最近更新 更多