Вспоминаем статью PHP и CGI. Обход ограничений безопасности. Основная мысль:
В общем мало или много кто знает, что при подключении php к апачу через cgi, есть возможность конфигурировать чуть ли не каждый скрипт отдельно. А если более конкретно, то для каждой папки с php скриптами может быть создан свой файл php.ini со своими настройками, которые перезапишут глобальные настройки.
А это создает огромную брешь в безопасности, т.к. можно обойти любые запреты и ограничения указанные в оригинальном php.ini. Причем на просторах интернета отсутствует какая либо внятная информация о запрете данного поведения
Наконец поднял для тестов сервер с fastcgi+php для тестов, и, во-первых, разобрался почему так происходит, а, во-вторых, нашел способ отключить это.
Вообщем все очень просто, читаем справку с php.net:
Поиск php.ini производится в следующих местах (по порядку поиска):
- По месту расположения модуля SAPI (PHPIniDir директива Apache 2, -c параметр командной строки CGI и CLI, php_ini параметр в NSAPI, PHP_INI_PATH переменная среды в THTTPD)
- Переменная среды PHPRC.
До PHP 5.2.0 поиск по переменной производился после поиска в реестре, указанном ниже.Как и в PHP 5.2.0, местоположение файла php.ini может быть указано для различных версий PHP. Следующие ключи реестра исследуются при поиске: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] и [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], где x, y и z подразумевают major, minor и release версии PHP. Если также имеется значение IniFilePath в любом из этих ключей, то местонахождение php.ini будет определено первым ключом по порядку. (только для Windows).[HKEY_LOCAL_MACHINE\SOFTWARE\PHP], значение IniFilePath (только для Windows).- Текущая директория (исключая CLI).
- Директория веб сервера (для SAPI модулей), или директория PHP
(иначе в директории Windows).В директории Windows (C:\windows или C:\winnt) (для Windows),или —with-config-file-path с выбором при компиляции.
(зачеркнуто то что подходит только для винды, и по сути нас мало интересует)
Собственно вот и корень проблемы: поиск php.ini в дирректории PHP или веб сервера осуществляется после поиска в текущем каталоге.
Теперь для того чтобы предотвратить запуск php.ini и текущей директории, путь к нему надо указать в одном из двух «предыдущих» мест поиска, в нашем случае это:
- -c параметр командной строки CGI и CLI
- Переменная среды PHPRC.
Для первого варианта можно отредактировать конфиг веб сервера, пример для apache:
FCGIWrapper "[путь до php] -c [путь до php.ini]" .php
Но впрочем это может выглядеть и по-другому. Не забываем перезапустить веб сервер.
Насчет указания места через переменную среды я не заморачивался, но по-идее должно хватить указания ее в httpd.conf или в /etc/init.d/apache2. Но все же мне кажется что лучше использовать первый вариант, т.к. он надежнее =)
В закладки! :)
Здравствуйте. Может подскажите где и как правильно прописать путь к php.ini для связки nginx+php-cgi (через spawn-fcgi).
Нет, боюсь не подскажу. Чесно говоря никогда не приходилось настраивать связку nginx + php-cgi