PHP - rmdir(权限被拒绝)
我有一个简单的脚本来创建和删除一个文件夹,但是当我尝试删除一个文件夹时,会出现错误。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与里面的一切)? 此外,如果你看到任何其他的改进,代码可以有,随时告诉我。 :-)
谢谢,迈克。
一般而言,Unix/Linux上的PHP脚本以“nobody”用户身份运行,这意味着他们需要“全部”权限,因此它是目录的权限问题。另外,要在Linux/Unix中删除文件或目录,您需要父目录的写权限。这可能是你的问题。
如果您对创建的文件或目录有问题,请使用chmod()
来设置正确的权限。
此外,它可能不是空的。
此外,值得一提的是,
$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;
是真的不好从安全角度考虑。消除该输入。
网络服务器需要对您要删除的文件夹具有写入权限。您可以提供这跟:
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部分。
看起来您需要对您要编辑的文件夹的访问权限。
要改变这一点:
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/
确保这是你想要做什么,你的应用是安全的。不要给任何应用程序写权限,因为它可能导致安全问题。
为了这个答案的目的,我将安全风险放在允许任何和所有上传目录放在一边。我知道这不是安全的,但我觉得这个问题是以外的原始问题的范围。
正如大家所说,这可能是一个权限问题。但是由于您已经在代码中创建了目录(这很可能在删除时以相同的用户身份运行)。它怀疑是这样。
要删除一个目录,你需要确保:
你有适当的权限(为大家指出)。
所有目录句柄在删除之前必须关闭。
(离开手柄开放会导致权限被拒绝错误)目录必须为空。
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;
}
}
好,目录“/上传”有777权限和文件夹创建工作,问题是出在命令rmdir()。 – Mike 2009-08-01 17:15:45
这里有很多糟糕的安全问题。 – Imagist 2009-08-01 17:29:16