【问题标题】:PHP - rmdir (permission denied)PHP - rmdir(权限被拒绝)
【发布时间】:2009-08-01 17:06:28
【问题描述】:

我有一个简单的脚本来创建和删除文件夹,但是当我尝试删除文件夹时,它会出现错误。

代码:

<?php
if ($_POST['hidden']) {
$key = "../g_test/uploads";
$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;
$dir = mkdir($new_dir_path);    
if($dir)
chmod ($new_dir_path, 0777); 
}
if ($_POST['hiddenSS']) {
$key = "../g_test/uploads";
$new_folder = $_POST['nazevS'];
rmdir($key."/".$new_folder);
}
?>

错误信息:

Warning: rmdir(../g_test/uploads/) [function.rmdir]: Permission denied in /home/free/howto.cz/m/mousemys/root/www/g_test/upload.php on line 51

有谁知道如何删除文件夹(希望里面的所有内容)? 此外,如果您看到任何其他改进,代码可能有,请随时告诉我。 :-)

谢谢,迈克。

【问题讨论】:

    标签: php permissions permission-denied


    【解决方案1】:

    一般来说,Unix/Linux 上的 PHP 脚本以“nobody”用户身份运行,这意味着它们需要“全部”权限,因此这是目录的权限问题。此外,要删除 Linux/Unix 中的文件或目录,您需要对 父目录 的写入权限。那可能是你的问题。

    如果您创建的文件或目录有问题,请在它们上使用chmod() 设置正确的权限。

    也可能不为空。

    另外,值得一提的是

    $new_folder = $_POST['nazevS'];
    $new_dir_path = $key."/".$new_folder;
    
    从安全的角度来看,

    真的很糟糕。清理输入。

    【讨论】:

    • 嗯,目录 "/uploads" 有 777 权限并且文件夹创建工作正常,问题出在 rmdir() 上。
    • 这里的安全性存在很多问题。
    【解决方案2】:

    出于此答案的目的,我将允许在目录中进行任何和所有上传的安全风险放在一边。我知道这不安全,但我觉得这个问题超出了原始问题的范围

    正如大家所说,这可能是权限问题。但是由于您已经在代码中创建了目录(删除时很可能以同一用户身份运行)。它怀疑是这样的。

    要删除目录,您需要确保:

    1. 您拥有适当的权限(正如每个人都指出的那样)。

    2. 所有目录句柄必须在删除前关闭
      (让句柄保持打开状态会导致权限被拒绝错误)

    3. 目录必须为空rmdir() 只删除目录,不删除里面的文件。所以如果里面还有东西,它就无法完成它的工作。

    要修复数字 2,它非常简单。如果你正在使用这样的东西:

    $hd = opendir($mydir);
    

    在删除之前关闭您的句柄:

    closedir($hd);
    

    对于数字 3,您想要执行的操作称为递归删除。您可以使用以下函数来实现:

    function force_rmdir($path) {
      if (!file_exists($path)) return false;
    
      if (is_file($path) || is_link($path)) {
        return unlink($path);
      }
    
      if (is_dir($path)) {
        $path = rtrim($path, DIR_SEPARATOR) . DIR_SEPARATOR;
    
        $result = true;
    
        $dir = new DirectoryIterator($path);
    
        foreach ($dir as $file) {
          if (!$file->isDot()) {
            $result &= force_rmdir($path . $file->getFilename(), false, $sizeErased);
          }
        }
    
        $result &= rmdir($path);
        return $result;
      }
    }
    

    【讨论】:

      【解决方案3】:

      您似乎需要对要编辑的文件夹具有访问权限。

      要改变这个:

      chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/
      

      或者你可能需要这样做

      sudo chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/
      

      确保这是您想要做的并且您的应用程序是安全的。不要给任何应用程序写权限,因为这可能会导致安全问题。

      【讨论】:

        【解决方案4】:

        网络服务器需要对您尝试删除的文件夹的写入权限。您可以提供:

        chgrp -R www-data g_test/uploads
        chmod g+w g_test/uploads
        

        其中 www-data 是运行网络服务器的用户(可能是 apache 或某些变体,具体取决于您的操作系统和服务器安装)。之后,您可以运行rmdir(如果目录不为空,则运行rm -r)。

        另外,请记住,让网络服务器能够写入目录会带来安全问题。在某些情况下,这可能允许恶意用户运行任意代码(即接管您的机器)或修改您的网站(即服务器间谍软件)。

        由于这些原因,您应该只给 dirs 写权限:

        • 绝对需要它们
        • 不包含源代码
        • 在包含脚本的目录之外
        • 归服务器所有

        在生产机器上的这个设置中,您可以为这种类型的文件设置一个单独的目录,只有 Apache 可以写入。如果您必须将文件部署到此目录,请使用sudo 或 root 帐户来限制具有访问权限的帐户。

        有关我的意思的更完整描述,请查看 Apache 文档中的 security tips 部分。

        【讨论】:

        • 我应该如何以正确的安全方式进行操作?