Немного длинный выстрел, но подумал, что посмотрю, есть ли у кого-нибудь исправление для этого:
У меня возникла проблема, из-за которой функция PHP unlink () может успешно удалить файл, даже если к рассматриваемому файлу были применены явные разрешения NTFS. Я даже попытался удалить все разрешения для файлов NTFS и тому подобное - тот же результат, и это меня озадачило.
ФАКТЫ
У меня Apache 2.2.22 с PHP 5.4.5 на Windows Server 2008 R2
Apache / PHP работают под пользователем EXODUS \ wwwuser, что подтверждается ответом на whoami в командной строке при запуске PHP-скрипта, например:
echo exec('whoami');
возвращается EXODUS\wwwuser
Файл «deleteme.txt» создается членом группы «BUILTIN \ Administrators», к файлу для EXODUS \ wwwuser применяются разрешения явного отказа, однако функция PHP unlink () успешно удаляет файл.
Я попробовал то же самое, удалив наследование разрешений для этого файла, удалив все разрешения (включая SYSTEM) и применив явный запрет «ПОЛНЫЙ КОНТРОЛЬ» к EXODUS \ wwwuser - угадайте, что, unlink () все еще удаляет файл ...
EXODUS \ wwwuser является членом BUILTIN \ Users, однако это не означает, что это повлияет на ситуацию.
EXODUS \ wwwuser не может удалить файл при интерактивном входе в систему.
Когда файлы записываются PHP, владельцем файла является EXODUS \ wwwuser.
Есть ли у кого-нибудь мысли по этому поводу?
Как я могу предоставить папки / файлы, которые нельзя удалить в каком-либо месте через PHP unlink (), которые находятся внутри определенной области open_basedir?
Я использую open_basedir, чтобы скрипты не вмешивались в файлы за пределами заявленного open_basedir - похоже, это работает нормально - например: невозможно удалить файлы, которые находятся за пределами местоположения, определенного open_basedir.
Привет, если PHP может удалить файл, даже если в разрешениях указано иное. Это, вероятно, означает, что Apache работает как пользователь с правами администратора.
Вы всегда можете попытаться проверить папку в Windows, чтобы убедиться, что все разрешения для дочерних папок сброшены, если вышеуказанная проблема не является проблемой.
Это возможно только в том случае, если сервер Apache на самом деле не работает под пользователем, о котором вы говорите. Включите аудит этой папки и проверьте еще раз, чтобы увидеть, какой пользователь удаляет файл.
Кроме того, кто является владельцем файла?
Я не использую PHP в Windows, поэтому не могу быть уверенным в его базовом коде, но когда я пишу какую-либо форму функции удаления, первое, что у меня есть, это попытаться удалить существующие разрешения. Просто возможно unlink()
делает то же самое. Если у вас включено соответствующее ведение журнала, вы сможете увидеть любое такое поведение в журналах событий Windows, поэтому зарегистрируйтесь там.