Доступ к файлам в PHP7

Доступ к файлам в PHP7.

Если только вы или люди, которым вы доверяете, имеете доступ в систему вашего веб-сервера, вы в целом можете не волноваться о разграничении прав доступа к файлам, которые используются в ваших РНР-сценариях или создаются ими. Однако, большинство веб-сайтов размещено-на машинах хостинг-провайдеров (ISP) и есть риск, что другие люди могут прочитать файлы, которые создает ваша РНР-программа. В то же время, в РНР существует множество способов, которые вы можете использовать для решения проблем с правами файлов. Об этом мы и поговорим.

Ограничиваем доступ к файловой системе

Вы можете установить опцию open_basedir, чтобы позволить доступ ваших РНР-сценариев только к определенному каталогу. Если open_basedir установлена в вашем php.ini, РНР ограничивает функции файловой системы и ввода/вывода так, что они могут работать только в указанном этой директивой каталоге и его подкаталогах. Например:

open_basedir = /some/path

Как только эта конфигурация вступит в силу, следующие вызовы будут работать:

unlink («/some/path/unwanted.exe»); indude («/some/path/less/travelled.inc»);

Но следующие вызовы закончатся ошибкой времени выполнения:

$fp = fopen («/some/other/file.exe», т’);

$dp = opendir («/some/path/../other/file.exe»);

Конечно, наш веб-сервер может запускать много приложений, каждое такое приложение обычно хранит файлы в своем собственном каталоге. Соответственно, вы можете настроить open_basedir отдельно для каждого виртуального узла в вашем httpd.conf:

<VirtualHost 1.2.3.4>

ServerName domainA.com

DocumentRoot /web/sites/domainA

php_admin_value open_basedir /web/sites/domainA

</VirtualHost>

Аналогично, вы можете настроить ее отдельно для каждого каталога или URL в вашем файле httpd.conf:

# no каталогу

<Directory /home/httpd/html/арр 1 >

php_admin_value open_basedir/home/httpd/html/арр 1</Directory>

# по URL

<Location /арр2>

php_admin_value open_basedir /home/httpd/html/арр2

</Location>

 

Директива open_basedir может быть установлена только в файле httpd. conf, а не в файле. htaccess, и вы должны использовать опцию php_admin_ value для установки open_basedir.

Используйте umask ()

Плохо сначала создавать файл, а затем устанавливать права доступа к нему. Это создает возможность “везучему” пользователю получить доступ к файлу до того, как будут изменены права доступа, и доступ к файлу ему будет заблокирован. Вместо этого используйте функцию umask (), изначально отсекающую ненужные права. Например:

umask (077);

//отключаем —rwxrwx $fh = fopen («/tmp/myfile», ‘w’);

По умолчанию функция fopen () пытается создать файл с правами 0666 (rw-rwrw-). Вызвав сначала umask (), вы отключите биты прав группы и других пользователей, оставив только 0600 (w). Теперь, когда вы вызовите fopen (), будет создан файл с установленными вами правами (0600).

Вообще не используйте файлы

Поскольку все сценарии на компьютере выполняются от имени одного и того же пользователя, файл, который был создан одним сценарием, может быть прочитан другим сценарием, независимо от того, кто написал этот сценарий. Все, что нужно знать сценарию — это имя файла.

От этого нельзя защититься, поэтому лучше всего не использовать файлы для хранения данных, которые должны быть защищены, более безопасно хранить данные в базе данных. Более сложное решение заключается в запуске отдельного демона Apache для каждого пользователя. Если вы добавите обратный прокси, например, haproxy, перед пулом экземпляров Apache, вы сможете обслужить более 100 пользователей на одной машине. Однако такое решение довольно редко используется из-за его сложности и стоимости по сравнению с обычной ситуацией, где один демон Apache может обслужить тысячи пользователей.

Файлы сессии

При использовании встроенной в РНР поддержке сессий, информация о сессии сохраняется в файлах. Каждый файл называется /tmp/sess_id, где id — имя сессии, обычно владелец этих файлов пользователь nobody (пользователь, под которым работает веб-сервер).

Поскольку все РНР-сценарии, как мы уже говорили, выполняются от имени одного и того же пользователя, это означает, что любой РНР-сценарий, размещенный на сервере, может прочитать любые файлы сессий для других сайтов на этом сервере. В ситуациях, когда ваш РНР-код хранится на сервере хостинг-провайдера, который совместно используется РНР-сценариями еще других пользователей, переменные, которые вы храните в своих сеансах, видимы другим сценариям РНР. Что еще хуже, другие пользователи сервера могут создать файлы в каталоге сессии /tmp. В результате пользователь может создать поддельный файл сессии, в котором будут любые переменные и значения, которые он захочет видеть в нем. И ничто ему в этом не помешает. Так, пользователь через свой браузер может отправить вашему сценарию cookie с именем фальшивой сессии и ваш сценарий благополучно загрузит переменные, сохраненные в поддельном файле сессии, который до этого был помещен в каталоге сессии.

Вы можете попросить вашего провайдера настроить сервер так, чтобы ваши файлы сессии хранились в вашем собственном каталоге. Обычно для этого в блоке VirtualHost в конфигурационном файле Apache (httpd.ini) создается строка:

php_value session. save_path /some/path

Если у вас есть самих доступ к файлу. htaccess, и ваш Apache позволяет переопределять настройки, вы можете внести необходимые изменения самостоятельно.

Прячем библиотеки РНР

Достаточно много информации о слабых местах вашего сервера можно почерпнуть, загрузив include-файлы или какие-либо данные (файлы), которые хранятся рядом с HTML и РНР-файлами в корневом каталоге документов веб-сервера. Чтобы предотвратить это, вам нужно хранить библиотеки кода и данные за пределами корневого каталога документов сервера.

Например, если корневым каталогом является /home/httpd/html, все, что находится в этом каталоге, может быть загружено через URL. Просто поместите код вашей библиотеки, конфигурационные файлы, журналы и другие данные за пределами указанного каталога (например, в /usr/local/lib/ туарр). Конечно, это не гарантирует, что кто-либо из других пользователей сервера не получит незаконный доступ к этим файлам (см. “Не используйте файлы»), но это по крайней мере предотвратит то, что данные файлы могут быть загружены удаленными пользователями.

Если вы по каким-либо причинам все-таки должны хранить некоторые вспомогательные файлы в своем корневом каталоге документов, то в таком случае вы должны настроить веб-сервер так, чтобы он отклонял запросы к этим файлам. Например, следующий пример указывает Apache отклонять запросы доступа к любому файлу с расширением.inc, которое чаще всего используется для include-файлов в РНР:

<Files ~ «\.inc$»>

Order allow,deny

Deny from all

</Files>

Но самый лучший способ предотвратить загрузку файлов с исходным кодом РНР — это всегда использовать расширение.php. Если вы, как мы рекомендовали выше, храните библиотеки кода в другом каталоге, вам нужно указать РНР, где их следует искать. Укажите путь к ним в каждой функции include () или require (), или же измените параметр include path в php.ini:

include_path =».:/usr/local/php:/usr/local/lib/myapp»;

Если вы уже создали свой сайт на PHP и провели тестирование на локальном сервере (LAMP) — настал тот час, когда необходимо определиться с арендой хостинга,  и в этом вам поможет хостинг для сайта украина: перейдя по ссылке вы найдете ТОП 10 хостингов, и опираясь как на рейтинг, так и на комментарии пользователей сможете подобрать оптимальный для вас вариант. Остается пожелать вашим проектам на PHP стабильного коннекта!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *