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

Ошибка msg:

 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 

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

Спасибо, Майк.

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

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

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

Кроме того, стоит отметить, что

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

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

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

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

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

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

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

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

 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/ 

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

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

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

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

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

По этим причинам вы должны только дать dirs write perms, что:

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

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

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