PHP - rmdir (权限被拒绝)

4

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

代码如下:

<?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

有人知道如何删除文件夹(希望里面的所有内容都被删除)吗? 如果您发现代码还有其他改进的地方,请随时告诉我。:-)

谢谢,迈克。

4个回答

5
通常情况下,Unix/Linux上的PHP脚本以用户“nobody”身份运行,这意味着它们需要“all”权限,因此这可能是目录权限问题。此外,在Linux/Unix中删除文件或目录需要对父目录具有写权限。这可能是您遇到的问题。
如果您在创建文件或目录时遇到问题,请使用chmod()设置正确的权限。
另外,它可能不是空的。
此外,值得一提的是:
$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;

从安全角度来看,这种输入非常糟糕。请对其进行清洗处理。


好的,“/uploads”目录具有777权限,文件夹创建工作正常,问题出在rmdir()上。 - Mike
5
这里的安全情况很糟糕。 - Imagist

4
为了回答这个问题,我会把允许任何和所有上传文件的安全风险放在一边。我知道这不安全,但我觉得这个问题超出了原始问题的范围。
正如大家所说,这可能是权限问题。但是由于您已经在代码中创建了目录(很可能在删除时运行相同的用户),我认为不是这个问题。
要删除目录,你需要确保:
1. 你有适当的权限(正如大家指出的那样)。 2. 所有目录句柄必须在删除之前关闭。(保留句柄可能会导致“权限被拒绝”错误) 3. 目录必须为空。rmdir()只删除目录,而不是其中的文件。因此,如果还有东西在里面,它就无法完成工作。
要解决第二个问题非常简单。如果你正在使用像这样的东西:
$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;
  }
}

0

Web服务器需要对您要删除的文件夹具有写入访问权限。 您可以使用以下方式提供此权限:

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

其中,www-data是Web服务器运行的用户(根据您的操作系统和服务器安装情况可能是Apache或其它变体)。之后,您可以运行rmdir(如果目录不为空,则运行rm -r)。

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

出于这些原因,您应该仅为以下目录授予写入权限:

  • 绝对需要它们的目录
  • 不包含源代码的目录
  • 位于包含脚本的目录之外的目录
  • 由服务器拥有的目录

在生产环境中,您可以为此类文件设置一个单独的目录,只允许Apache进行写入。如果您必须将文件部署到此目录,请使用sudo或root帐户进行操作,以限制可以访问该目录的帐户。

若想了解更完整的说明,请查看 Apache 文档中的 安全提示 部分。


我应该如何以适当的安全方式进行操作? - Mike

0

看起来你需要访问正在尝试编辑的文件夹的权限。

要更改这个:

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/

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


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