Включение в каталоги документов веб-сервера активного содержимого наподобие скриптов и исполняемых файлов ослабляет безопасность. Из-за ошибок в конфигурации сервера, когда скрипты не выполняются, а отображаются в браузере как HTML-документы, утекает интеллектуальная собственность или конфиденциальная информация наподобие паролей. Поэтому системные администраторы отдают преимущество настройке другой структуры каталогов хранения скриптов, к которым открывают доступ только через CGI-интерфейс PHP, который гарантирует интерпретацию, а не вывод кода скриптов.
Потребуется установить через директиву doc_root корневой каталог, который отличается от корневого каталога веб-документов, если метод, который проверяет запросы на перенаправление, как описывает предыдущая глава, недоступен.
Корневой каталог для PHP-скриптов устанавливают
в файле конфигурации PHP
через директиву doc_root
или через переменную окружения PHP_DOCUMENT_ROOT.
При установке корневого каталога для PHP-скриптов CGI-версия
двоичного файла PHP сформирует путь к файлу, который требуется открыть,
на основе значения директивы doc_root
и пути,
который указали в запросе. Это гарантирует, что скрипты за пределами
этого каталога, за исключением каталога user_dir
,
не выполнятся.
Другая директива, которая помогает создавать безопасные пути к файлам, —
user_dir. Путём к файлу, который требуется открыть,
управляет только директива doc_root
, если директиву
user_dir
не установили. При запросе URL-адреса наподобие
http://my.host/~user/doc.php обработчик откроет файл
с названием ~user/doc.php (да, название каталога
начинается с символа ~
) в каталоге, который установили в директиве
doc_root
, а не файл в домашнем каталоге пользователей.
Но если для директивы user_dir
установили значение наподобие
public_php, то запрос URL-адреса
http://my.host/~user/doc.php
откроет файл doc.php, который лежит
в домашнем каталоге пользователя в директории public_php.
Приведём пример. Обработчик выполнит файл /home/user/public_php/doc.php,
если домашний каталог пользователя /home/user.
PHP разворачивает значение директивы user_dir
независимо от настройки директивы doc_root
,
поэтому управлять корневым каталогом документов веб-сервера
и каталогом пользователя разрешается по отдельности.