Файлы, написанные на PHP / Apache, не учитывают бит setgid каталога - PullRequest
4 голосов
/ 11 октября 2011

Почесывая голову на этом, кажется таким простым.

У меня есть система управления контентом на основе PHP для нашего сайта, написанная подрядчиком. Одной из функций является возможность загрузки изображений для отображения в различных местах на сайте (например, в галерее продуктов). Все такие загруженные изображения хранятся в определенном каталоге, называемом «вложения».

drwxrwsr-x 4 www ftpusers 4096 10.10 14:47 приложения

Как вы можете видеть, у меня установлен бит setgid для этого каталога, так что любые записанные файлы будут иметь группу, которую пользователи (например, пользователь FTP), которым необходим доступ к этим файлам, смогут их изменять / перезаписывать. Я установил маску для Apache, чтобы он записывал файлы как доступные для записи группой.

Когда я пытаюсь сделать это с ЛЮБЫМ пользователем в системе, создав новый файл в этом каталоге, он правильно наследует группу родителя. Когда новый файл создается с помощью PHP, работающего в Apache, он всегда является владельцем apache.apache. Apache, кажется, игнорирует бит setgid, что я не думаю, что это может сделать, как это было сделано файловой системой. Вот один файл, который я загрузил:

-rw-rw-r-- 1 apache apache 30536 10 октября 14:43 209

Я не могу напрямую тестировать пользователя apache, так как для него не задана оболочка входа (по понятным причинам безопасности).

Я могу получить такую ​​же возможность разрешений, добавив группу ftpusers в группу apache, но это не кажется разумным с точки зрения безопасности.

Я обнаружил одну вещь, которая, похоже, может быть связана - безопасный режим php, который, как я убедился, отключен в /etc/php.ini, хотя я не уверен, что нашел файл php.ini, который mod_php в Apache используется. Сценарий php использует move_uploaded_file (); Насколько я могу судить, в коде php ничего особенного с разрешениями не делается.

Мое лучшее предположение могло бы состоять в том, что это преднамеренные ограничения для безопасности, но я не могу найти ничего, что, кажется, указывает на то, что это так.

Запуск CentOS 5.6 с Apache 2.2.17 и php 5.2.16.

У кого-нибудь есть подсказка?

1 Ответ

2 голосов
/ 25 февраля 2013

Когда вы загружаете файл, он создается в каталоге, указанном параметром PHP «upload_tmp_dir».Затем move_uploaded_file () перемещает его в ваш целевой каталог.Он сохраняет права, предоставленные ему при создании, а не права доступа к целевому каталогу, в который вы перемещаете файл.

Таким образом, вы хотите, чтобы у tmp dir были те разрешения, которые вы хотите, в основном те, которые вы дали своей целиреж.Затем он будет создан с эффектом setgid, и ход сохранит их.

IIRC "upload_tmp_dir" недоступен в .htaccess, поэтому, если вы не можете изменить этот параметр или разрешения, предоставленные dir, вы будетенужно сделать это по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...