Главная страница \ Статьи \ Статьи по PHP \ Загрузка файлов: проблема прав

Загрузка файлов: проблема прав

При написании скриптов все так или иначе сталкиваются с вопросом загрузки файлов на сервер. Казалось бы, что может быть проще – загрузить файл на сервер и все работает.

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

На разных системах (в статье рассматриваются исключительно Unix-системы) наблюдается абсолютно различное распределение прав доступа к файлам и каталогам в зависимости от предпочтений администраторов этих систем. На одних системах необходимо устанавливать права 777, другие требуют установки прав 755, на третьих это 644 и так далее. Заставлять каждого пользователя скрипта самостоятельно отыскивать набор прав и изменять числовое значение где-то внутри скрипта – неблагодарное дело, т.к. все равно пользователи будут писать автору с просьбой рассказать что и куда нужно установить.

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

Допустим, скрипт работает с каталогом /path/to/file/, в котором сохраняет все необходимые данные. Права на этот каталог – 755, которые означают, что пользователь, который создал этот каталог, имеет полный доступ к его содержимому, а другие пользователи, в том числе входящие в ту же группу, могут только просматривать содержимое каталога и читать данные из каталога.

Чтобы пользователи могли читать файлы из этого каталога, эти файлы должны иметь права 644. Права 755 назначать файлам данных крайне не желательно, потому что это ставит под угрозу безопасность сервера.

Можно вручную указать, что права на файлы внутри этого каталога должны быть 644, а можно автоматически определять права для вложенных файлов. Для этого необходимо определить права на каталог, в который находится файл с данными, а затем убрать флаг исполнения файлов. Это можно сделать с помощью следующего кода:

<?php
          $catalog=’/path/to/file/’;
          $file=’filename.ext’;
          $perms=fileperms($catalog);
          $perms&=0666;
          chmod($catalog.$file, $perms);
?>

Суть этого кода в том, чтобы вначале получить набор прав на каталог, в котором располагается файл с данными. Т.к. права на каталоги в большинстве случаев содержат флаг разрешающий исполнение, необходимо сбросить этот флаг. В данном случае это делается с помощью двоичной операции И, которая оставляет все флаги, кроме флага исполнения. Если права на каталог 755, то на файлы будет 644. Если 777, то на файлы 666. Если 775, то 664. И в последнюю очередь устанавливаем права для конечного файла при помощи функции chmod.

Если же необходимо вначале создать вложенный каталог, то можно воспользоваться следующим кодом:

<?php
          $catalog=’/path/to/catalog/’;
          $subcatalog=’catname’;
          $perms=fileperms($catalog);
          chmod($catalog.$subcatalog, $perms);
?>

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

Таким образом, появляется возможность избавиться от явного указания прав в тексте скрипта.

Powered by Elise