PHP - rmdir (разрешение отклонено) - PullRequest
3 голосов
/ 01 августа 2009

У меня есть простой скрипт для создания и удаления папки, но когда я пытаюсь удалить папку, она вызывает и выдает ошибку.

код:

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

5 голосов
/ 01 августа 2009

Для целей этого ответа я оставлю риски безопасности, связанные с любыми загрузками в каталоге. Я знаю, что это небезопасно, но я чувствую, что эта проблема выходит за рамки исходного вопроса .

Как все говорили, это может быть проблема с разрешением. Но так как вы создали каталог в своем коде (который, скорее всего, запускается от имени того же пользователя при удалении). Это сомнение, что это так.

Чтобы удалить каталог, вам необходимо убедиться, что:

  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;
  }
}
5 голосов
/ 01 августа 2009

Вообще говоря, PHP-скрипты в Unix / Linux запускаются как пользователь «nobody», что означает, что им нужны привилегии «all», так что это проблема с правами доступа к каталогу. Кроме того, чтобы удалить файл или каталог в Linux / Unix, вам необходимы права на запись в родительский каталог . Это может быть вашей проблемой.

Если у вас есть проблемы с файлами или каталогами, которые вы создаете, используйте chmod() для них, чтобы установить правильные разрешения.

Также он может быть не пустым.

Также стоит упомянуть, что

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

действительно плохо с точки зрения безопасности. Санируйте этот ввод.

0 голосов
/ 01 августа 2009

Похоже, вам нужны права доступа к папке, которую вы пытаетесь редактировать.

Чтобы изменить это:

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/

Убедитесь, что это именно то, что вы хотите сделать, и что ваше приложение защищено. Не давайте права на запись ни одному приложению, так как это может привести к проблемам с безопасностью.

0 голосов
/ 01 августа 2009

Веб-серверу требуется доступ на запись в папку, которую вы пытаетесь удалить. Вы можете предоставить это:

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

где www-data - это пользователь, под которым работает веб-сервер (может быть apache или может отличаться в зависимости от вашей ОС и установки сервера). После этого вы можете запустить rmdir (или rm -r, если каталог не пустой).

Кроме того, имейте в виду, что предоставление веб-серверу возможности записи в каталог создает проблемы с безопасностью . В определенных ситуациях это может позволить злоумышленнику запустить произвольный код (то есть захватить ваш компьютер) или изменить ваш веб-сайт (то есть серверную шпионскую программу).

По этим причинам вы должны давать директорам только на выписку:

  • абсолютно нуждаются в них
  • не содержит исходный код
  • находятся за пределами каталога, содержащего сценарии
  • принадлежит серверу

В этой настройке на рабочем компьютере вы можете создать отдельный каталог только для файлов этого типа, в который может записывать только Apache. Если вам необходимо развернуть файлы в этом каталоге, используйте sudo или учетную запись root, чтобы ограничить доступ к учетным записям.

Для более полного описания того, что я имею в виду, взгляните на раздел Советы по безопасности в документации Apache.

...