首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP - rmdir (权限被拒绝)

PHP - rmdir (权限被拒绝)
EN

Stack Overflow用户
提问于 2009-08-01 17:06:28
回答 4查看 14.7K关注 0票数 4

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

代码:

代码语言:javascript
复制
<?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);
}
?>

错误消息:

代码语言:javascript
复制
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

有没有人知道怎么删除这个文件夹(最好是把里面的所有东西都删除)?此外,如果您看到任何其他改进,代码可以有,请随时告诉我。:-)

谢谢,迈克。

EN

回答 4

Stack Overflow用户

发布于 2009-08-01 17:13:10

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

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

此外,它可能不是空的。

另外,值得一提的是

代码语言:javascript
复制
$new_folder = $_POST['nazevS'];
$new_dir_path = $key."/".$new_folder;

从安全的角度来看,真的是不好的吗?对输入进行清理。

票数 5
EN

Stack Overflow用户

发布于 2009-08-01 18:34:12

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

正如每个人都说的,这可能是一个许可问题。但由于您已经在代码中创建了该目录(删除后,该目录很可能是以同一用户身份运行)。这是值得怀疑的。

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

  1. 你有适当的权限(正如每个人所指出的)。在删除之前,必须关闭
  2. 所有目录句柄

(保持句柄打开可能会导致拒绝权限和错误)

  • be 。rmdir()只删除目录,而不删除目录中的文件。所以如果里面还有东西,它就不能工作了。

要解决第二个问题,它非常简单。如果您使用的是这样的东西:

代码语言:javascript
复制
$hd = opendir($mydir);

在删除前关闭您的句柄:

代码语言:javascript
复制
closedir($hd);

对于第三个,你要做的就是递归删除。您可以使用以下函数来实现此目的:

代码语言:javascript
复制
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;
  }
}
票数 5
EN

Stack Overflow用户

发布于 2009-08-01 17:15:00

The服务器需要您尝试删除的文件夹的写访问权限。您可以通过以下方式提供它:

代码语言:javascript
复制
chgrp -R www-data g_test/uploads
chmod g+w g_test/uploads

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

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

出于这些原因,您应该仅授予满足以下条件的目录写入权限:

  • 绝对需要它们
  • 不包含源代码
  • 位于包含

by 的服务器的目录之外

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

有关我所指的更完整的描述,请查看Apache文档中的security tips部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1217022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档