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

4 回答 4

5

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

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

它也可能不是空的。

另外,值得一提的是

$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;

从安全的角度来看确实很糟糕。清理输入。

于 2009-08-01T17:13:10.493 回答
5

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

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

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

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

  2. 在删除之前必须关闭所有目​​录句柄。
    (让句柄保持打开状态会导致Permission denied错误)

  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;
  }
}
于 2009-08-01T18:34:12.483 回答
0

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

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

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

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

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

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

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

有关我的意思的更完整描述,请查看 Apache 文档中的安全提示部分。

于 2009-08-01T17:15:00.490 回答
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/

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

于 2009-08-01T17:29:14.580 回答