У меня есть простой сценарий для создания и удаления папки, но когда я пытаюсь удалить папку, она вызывает ошибку и ошибки.
Код:
<?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;
действительно плохо с точки зрения безопасности. Санируйте этот вход.
В целях этого ответа я поставлю риски безопасности, позволяющие оставлять любые и все загрузки в каталоге. Я знаю, что это не безопасно, но я чувствую, что этот вопрос выходит за рамки первоначального вопроса .
Как говорили все, это может быть проблема разрешения. Но так как вы создали каталог в своем коде (который, скорее всего, работает как один и тот же пользователь при удалении). Он сомневается в этом.
Чтобы удалить каталог, вам необходимо убедиться, что:
У вас есть соответствующие разрешения (как указывали все).
Перед удалением все дескрипторы каталога должны быть закрыты .
(открытие открытых дескрипторов может привести к отказам в разрешении на отказ )
Каталог должен быть пустым . 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.