При инсталляции в виде приложения CGI

Возможные атаки

Использование PHP в виде приложения CGI - вариант для тех, кто по тем или иным причинам не хочет встраивать PHP в приложение сервера (к примеру, Apache), в виде модуля, или для тех, то хочет использовать PHP совместно с CGI-оболочками, помогающими создать безопасную среду для выполнения программ. Такая настройка обычно включает в себя инсталляцию приложения PHP в директорию cgi-bin на сервере. Рекомендация CERTCA-96.11 выступает против помещения интерпретаторов в cgi-bin. Даже при том, что PHP может быть использован, как независимый интерпретатор, он разрабатавылся для предотвращения атак, связанных с данным вариантом настройки:

Вариант 1: предоставление только общего содержимого

Если ваш сервер не содержит ничего защищенного паролем или списком IP-адресов, то в вышеперечисленных опциях нет необходимости. Если ваш Web-сервер не допускает перенаправлений, или если сервер не имеет возможности безопасно перенаправить запрос приложению PHP, вы можете установить опцию --enable-force-cgi-redirect конфигурирующей программе. Однако, вам все равно придется следить за тем, чтобы ваши программы не зависели от метода их вызова, как прямого http://my.host/cgi-bin/php/dir/script.php так и с использованием перенаправления http://my.host/dir/script.php.

Перенаправление может быть настроено в сервере Apache с использованием директив AddHandler и Action directives (см. ниже).

Вариант 2: использование --enable-force-cgi-redirect

Эта опция компиляции не дает никому использовать PHP напрямую, с применением URL вроде http://my.host/cgi-bin/php/secretdir/script.php. PHP будет транслировать данные только в том случае, если они уже прошли через перенаправление Web-сервера.

Обычно перенаправление в сервере Apache конфигурируется с использованием следующих команд:

Action php-script /cgi-bin/php
AddHandler php-script .php

Эта опция была проверена только для Web-сервера Apache и основывается на установке им не-CGI-стандартной переменной окружения REDIRECT_STATUS для перенаправленных запросов. Если ваш Web-сервер не поддерживает никаких путей указания того, осуществлялось ли перенаправление запроса, вы не можете использовать эту опцию и должны использовать другие варианты использования приложения CGI, описанные ниже.

Вариант 3: установка doc_root или user_dir

Помещение активного содержимого (вроде программ и исполняемых файлов) в директории документов Web-сервера считается небезопасным. Если в случае какой-либо ошибки в конфигурировании программы не выполнятся, а отобразятся как обычные HTML-документы, это приведет к утечке интеллектуальной собственности или скрытой информации вроде паролей. Поэтому многие системные администраторы предпочитают создавать отдельную структуру директорий для программ, доступных только через PHP CGI, а поэтому всегда интепретируемых и отображаемых верно.

К тому же, если недоступен метод безопасного перенаправления запросов, описанный в предыдущей части, необходимо установить doc_root для программ, отличный от корневого каталога документов Web-сервера.

Корневой каталог документов для программ PHP можно установить с помощью директивы doc_root в файле конфигурации или с помощью переменной окружения PHP_DOCUMENT_ROOT. Если такая установка сделана, то CGI-версия PHP всегда будет добавлять к информации пути в запросе значение параметра doc_root, так что в этом случае вы можете быть уверены, что ни одна программа не выполнится за пределами этой директории (исключение составляет лишь случай с использованием параметра user_dir, описанный ниже).

Еще одной полезной опцией является user_dir. Если user_dir не задана, то единственным фактором, влияющим на имя открываемого файла является doc_root. Открытие URL вроде http://my.host/~user/doc.php не приведет в этом случае к открытию файла внутри домашнего каталога пользователя. В этом случае будет открыт файл ~user/doc.php в каталоге, заданном в doc_root.

Если user_dir установлена, к примеру, в public_php, то запрос http://my.host/~user/doc.php откроет файл doc.php в каталоге public_php, находящемся в домашнем каталоге пользователя. Если домашний каталог пользователя - /home/user, то в этом случае будет открыт файл /home/user/public_php/doc.php.

user_dir используется независимо от doc_root, что дает возможность задавать корневую директорию документов и пользовательские директории независимо друг от друга.

Вариант 4: интерпретатор PHP вне дерева документов Web

Весьма безопасным является помещение программы-транслятора PHP за пределами дерева документов Web-сервера. К примеру, в /usr/local/bin. У этого варианта есть лишь один недостаток - то, что в начало каждого файла с тэгами PHP придется помещать следующую строку:

#!/usr/local/bin/php

. Также потребуется сделать данные файлы исполняемыми, т.е. придется обращаться с ними так же, как и с любыми другими CGI-программами на Perl, sh или на других известных языках, использующих конструкцию #! для запуска.

Для того, чтобы PHP начал в данном случае корректно обрабатывать PATH_INFO и PATH_TRANSLATED, транслятор PHP должен быть скомпилирован с опцией конфигурации --enable-discard-path.