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);
Другие вопросы по тегам