PHP - rmdir(许可被拒绝)

Mik*_*ike 3 php permissions permission-denied

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

代码:

<?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);
}
?>
Run Code Online (Sandbox Code Playgroud)

错误消息:

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,迈克.

cle*_*tus 5

一般来说,Unix/Linux上的PHP脚本以用户"nobody"运行,这意味着他们需要"所有"权限,因此它是目录的权限问题.此外,要删除Linux/Unix中的文件或目录,您需要在父目录上具有写权限.那可能是你的问题.

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

它也可能不是空的.

此外,值得一提的是

$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;
Run Code Online (Sandbox Code Playgroud)

真正从安全角度来看不好.消除那种输入.

  • 这里的安全性有很多不好处. (5认同)

And*_*ore 5

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

正如大家所说,这可能是一个许可问题.但是,因为您已在代码中创建了目录(最有可能在删除时作为同一用户运行).它怀疑是这样的.

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

  1. 你有适当的权限(正如大家指出的那样).

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

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

要修复2号,它非常简单.如果你使用这样的东西:

$hd = opendir($mydir);
Run Code Online (Sandbox Code Playgroud)

删除前关闭句柄:

closedir($hd);
Run Code Online (Sandbox Code Playgroud)

对于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;
  }
}
Run Code Online (Sandbox Code Playgroud)