2009-08-01 243 views
2

我有一个简单的脚本来创建和删除一个文件夹,但是当我尝试删除一个文件夹时,会出现错误。PHP - rmdir(权限被拒绝)

代码:

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

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

谢谢,迈克。

回答

5

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

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

此外,它可能不是空的。

此外,值得一提的是,

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

真的不好从安全角度考虑。消除该输入。

+0

好,目录“/上传”有777权限和文件夹创建工作,问题是出在命令rmdir()。 – Mike 2009-08-01 17:15:45

+5

这里有很多糟糕的安全问题。 – Imagist 2009-08-01 17:29:16

0

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

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

其中WWW的数据是Web服务器下运行的用户(可能是Apache或一些变化因您的操作系统和服务器安装上)。在此之后,您可以运行rmdir(或rm -r,如果目录不为空)。

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

由于这些原因,你应该只给迪尔斯写烫发:

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

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

有关我的意思的更完整说明,请参阅Apache文档中的security tips部分。

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/ 

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

3

为了这个答案的目的,我将安全风险放在允许任何和所有上传目录放在一边。我知道这不是安全的,但我觉得这个问题是以外的原始问题的范围。

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

要删除一个目录,你需要确保:

  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; 
    } 
}