rmdir() ошибка с определенным именем файла? Доступ запрещен
Во-первых, давайте уберем это с пути:
- В каталоге нет открытых ручек.
- В каталоге нет файлов.
chmod
Разрешение 0777 не предотвращает ошибку.- имя каталога правильное.
Теперь вот моя проблема. rmdir()
выдает эту ошибку при попытке удалить каталог:
rmdir (098f6bcd4621d373cade4e832627b4f6) [function.rmdir]: доступ запрещен в пути \to\administratorrate.php в строке 124
098f6bcd4621d373cade4e832627b4f6 - это имя каталога.
Вот соответствующая часть сценария.
if(is_dir($userhash)) :
foreach (new DirectoryIterator($userhash) as $fileInfo) {
$fileName = $fileInfo->getFilename();
if($fileInfo->isDot()) continue;
if(!rename($userhash.'/'.$fileName , 'trashcan/'.$username.'/'.$fileName)) {
echo '<p class="error">Could not move '.$fileName.'</p>';
$err = 1;
}
}
else :
echo '<p class="error">Unable to delete files! error: 67</p>';
$err = 1;
endif;
//JUST TO BE SURE
chmod('./',0777);
chmod($userhash,0777);
// RMDIR ONCE THE DIR IS EMPTY.
if(rmdir($userhash))
echo '<p class="success">Deleted the user directory. The files are in the trash.</p>';
else {
echo '<p class="error">Could not remove the user directory. Error: 656</p>';
$err = 1;
}
Обновить
Я вручную создал каталог 'jake'
в том же каталоге. я сделал rmdir('jake');
и это сработало отлично. Теперь я вручную создал каталог '098f6bcd4621d373cade4e832627b4f6'
в том же каталоге. я сделал rmdir('098f6bcd4621d373cade4e832627b4f6');
и он ошибся!
Обновление 2
Это начинает выглядеть как-то странно rmdir()
ошибка, так же маловероятно, как кажется. Вот имена каталогов, которые я создал, а затем попытался удалить с помощью rmdir
;
098f6bcd4621d373cade4e832627b4f6 | didn't work (quintuple checked)
098f6bcd4621d373cade4e832627b4f7 | worked
098f6bcd4621d373cade4e832627b4f | worked
098f6bcd4621d373cade4e832627b4f66 | worked
1 ответ
Чтобы иметь возможность удалить файл:
- пользователь должен иметь права на запись в каталог PARENT
- флаг ограниченного удаления НЕ должен быть установлен для каталога PARENT
ОБНОВЛЕНИЕ: Об ограниченном флаге удаления - от man chmod
:
ОГРАНИЧЕННЫЙ ФЛАГ УДАЛЕНИЯ ИЛИ КЛЕЙКА
Ограниченный флаг удаления или закрепленный бит - это один бит, интерпретация которого зависит от типа файла. Для каталогов это предотвращает удаление или переименование файла в каталоге непривилегированным пользователям, если они не владеют файлом или каталогом; это называется флагом ограниченного удаления для каталога и обычно встречается в каталогах, доступных для записи во всем мире, таких как / tmp. Для обычных файлов в некоторых старых системах этот бит сохраняет текстовое изображение программы на устройстве подкачки, поэтому при запуске он загружается быстрее; это называется липким битом.
Вы можете установить его, добавив 1 к первой восьмеричной цифре в режиме, например:
chmod 1xxx dirname
ОБНОВЛЕНИЕ 2:
Имеет ли пользователь, под которым выполняется php, права доступа к родительскому каталогу chmod?
Другими словами, вы уверены, что первый вызов chmod возвращает true?
chmod('./',0777);