Решаем проблему CGI и PHP.ini

3 комментария

phpВспоминаем статью 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. Но все же мне кажется что лучше использовать первый вариант, т.к. он надежнее =)

  1. Mapk

    Здравствуйте. Может подскажите где и как правильно прописать путь к php.ini для связки nginx+php-cgi (через spawn-fcgi).

    1. Дмитрий Амиров Автор

      Нет, боюсь не подскажу. Чесно говоря никогда не приходилось настраивать связку nginx + php-cgi

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

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.