Я реализую загрузку файла в symfony2. Мой объект File принадлежит пользователю и представляет загруженный файл. Загруженные файлы не должны быть доступны для всех, кроме администраторов и владельца. Для решения этой проблемы (кроме защиты контроллера) я сохраняю их в каталоге, который не находится под/web /. Я назвал этот каталог/private_files/(и находится в корневом каталоге проекта).Позволяет веб-серверу удалять загруженные файлы, как?
Чтобы разрешить веб-сервер для записи в этот каталог я побежал это (я на Mac OS X Mavericks):
$ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" private_files/
$ sudo chmod +a "www allow delete,write,append,file_inherit,directory_inherit" private_files/
загрузка работает отлично. Однако при попытке удалить файлы через контроллер с
unlink($path)
Я получаю ошибку «Warning: Разорвать связь (путь/к/файлу): Доступ запрещен».
При перечислении файлов на терминале с ls -al
, я получаю
drwxr-xr-x+ 3 myuser staff 204 Mar 23 11:59 .
drwxr-xr-x 24 myuser staff 816 Mar 21 19:51 ..
-rw-r--r-- 1 _www wheel 7395585 Mar 23 11:59 uploaded_file_1
где я замечаю, что загруженные файлы не имеют разрешения на исполнение и «+», который представляет списки управления доступом.
Каков правильный подход, позволяющий удалить эти файлы с помощью метода unlink? Должны ли файлы наследовать ACL (и если да, то как)? Или должен ли применяться chmod в каталоге? Большое спасибо.
Я думаю, это потому, что ваша папка не принадлежит пользователю Apache, который обрабатывает php. –
ОК, так что меняя владельца и группу с 'sudo chown www: wheel private_files' сделал трюк, но я все еще удивляюсь, почему одни и те же ACL работают с приложением/кешем, а не с моей папкой uploads. – picheto
Я думаю, потому что вы создали папку/private_files/с другим пользователем, не являющимся пользователем apache, приложение/кеш создано программно, поэтому он владеет им и может создавать/удалять. я обновлю его как ответ –