Использование PHP в виде приложения CGI - вариант для тех, кто по тем или иным причинам не хочет встраивать PHP в приложение сервера (к примеру, Apache), в виде модуля, или для тех, то хочет использовать PHP совместно с CGI-оболочками, помогающими создать безопасную среду для выполнения программ. Такая настройка обычно включает в себя инсталляцию приложения PHP в директорию cgi-bin на сервере. Рекомендация CERTCA-96.11 выступает против помещения интерпретаторов в cgi-bin. Даже при том, что PHP может быть использован, как независимый интерпретатор, он разрабатавылся для предотвращения атак, связанных с данным вариантом настройки:
Получение доступа к системным файлам: http://my.host/cgi-bin/php?/etc/passwd
Информация запроса в URL после знака вопроса (?) передается с помощью CGI интерпретатору в виде командной строки. Обычно интерпретаторы открывают и выполняют файл, заданный первым аргументом в данной строке.
При вызове в роли приложения CGI, PHP не интерпретирует аргументы командной строки.
Получение доступа к любому документу на сервере: http://my.host/cgi-bin/php/secret/doc.html
Информационнася часть URL после названия приложения PHP /secret/doc.html обычно используется для задания файла, который будет открыт и интерпретирован приложением CGI. В общем случае для перенаправления запросов вида http://my.host/secret/script.php интерпретатору PHP используются директивы конфигурации Web-сервера (к примеру, Action в Apache). При такой настройке, сервер сначала проверяет разрешения на доступ к данной директории /secret, и только после создает перенаправленный запрос http://my.host/cgi-bin/php/secret/script.php. К сожалению, если запрос уже дан в вышеприведенной форме, сервер не выполняет никаких проверок на право доступа к файлу /secret/script.php, выполняя данную проверку только для файла /cgi-bin/php. Таким образом, любой пользователь c доступом к /cgi-bin/php может получить доступ к любому защищенному документу на сервере.
В PHP, опция конфигурации компилятора--enable-force-cgi-redirect и опции конфигурации времени выполненияdoc_root и user_dir могут быть использованы для предотвращения подобных атак, если дерево документов сервера имеет каталоги с ограничением доступа. Далее приводятся подробные пояснения к различным комбинациям опций.
Если ваш сервер не содержит ничего защищенного паролем или списком 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 (см. ниже).
Эта опция компиляции не дает никому использовать 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, описанные ниже.
Помещение активного содержимого (вроде программ и исполняемых файлов) в директории документов 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, что дает возможность задавать корневую директорию документов и пользовательские директории независимо друг от друга.
Весьма безопасным является помещение программы-транслятора PHP за пределами дерева документов Web-сервера. К примеру, в /usr/local/bin. У этого варианта есть лишь один недостаток - то, что в начало каждого файла с тэгами PHP придется помещать следующую строку:
. Также потребуется сделать данные файлы исполняемыми, т.е. придется обращаться с ними так же, как и с любыми другими CGI-программами на Perl, sh или на других известных языках, использующих конструкцию #! для запуска.Для того, чтобы PHP начал в данном случае корректно обрабатывать PATH_INFO и PATH_TRANSLATED, транслятор PHP должен быть скомпилирован с опцией конфигурации --enable-discard-path.
Пред. | Начало | След. |
Безопасность | Уровень выше | При инсталляции в виде модуля Apache |