@unknown4096

Зачем Nginx с “fastcgi_pass PHP_ADMIN_VALUE ...” ломает PHP-FPM?

Представим, что на сервере хостятся несколько сайтов: alfa.ru, beta.ru и gamma.ru. Наша задача обеспечить бесперебойное функционирование и защиту этих сайтов. Представляем дальше, что сайт gamma.ru взломали злые хацкеры, которые сейчас имеют доступ даже к файловой системе (Ну не написали проверку на расширение загружаемого файла, с кем не бывает!). Единственный способ защитить 2 других сайта – установить директиву open_basedir в php.ini отдельно для каждого сайта (уточняю, что сайты висят на одном пуле, следовательно принадлежат одному пользователю (работаем с PHP-FPM)), указываем [HOST=...] и накатываем... Да только есть одно “но”: эта директива имеет уровень доступа PHP_INI_ALL, который позволяет изменять еë даже в исполняемом PHP-скрипте. Как мы знаем, хацкеры имеют доступ... На этот случай ещë предусмотрен вариант указания директив в конфигурации пула с помощью php_admin_value[...], да вот опять: сайты висят на одном пуле, то есть open_basedir надо указывать не на пул, а на каждый хост. Единственный оставшийся вариант, который я знаю, – Nginx. (Буду не против, если подскажете другие варианты. Надо пробовать всë и извлекать лучшее!)

Указываем в разделе “server” или “location” fastcgi_param PHP_ADMIN_VALUE "... = ..."; и получаем полный облом. Возможно, я просто дурак, но после такого указания PHP отвечает пустой страницей с длиной, естественно, 0 байт. Удаляю – страница выводится, возвращаю – опять нет. Самое интересное в этом всëм то, что продампив обмен Nginx’a с PHP-FPM (и обратно) tcpdump’ом, ответ от PHP приходит, это не Nginx что-то мутит, да только пустой (точнее сказать, только заголовки). Проще говоря, PHP перестаëт исполнять код, о чëм дополнительно свидетельствует время исполнения – 0.001 секунды, исходя из логов, собираемых Nginx’ом.

Ещë могу отметить, что задав эту директорию в разделе “http”, PHP исполняет скрипт, да только не учитывает эти директивы: в случае с “server” или “location” они передаются до основных директив, без которых ни при каких условиях не запустится скрипт (наподобие корня или запрашиваемого файла), а вот в случае с “http” – после.
  • Вопрос задан
  • 176 просмотров
Решения вопроса 2
Lynn
@Lynn
nginx, js, css
Много букв, никакой особой конкретики, но мой хрустальный шар с вероятностью 99% показывает что автор просто не прочитал документацию, в частности:
fastcgi_param
[...]
Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы fastcgi_param
[...]

и указывая fastcgi_param на уровне location вы «стираете» все аналогичные директивы которые были заданы на уровне server и http.
Ответ написан
@unknown4096 Автор вопроса
Важно учитывать ответ Lynn «Кофеман», он дан по существу.

А теперь о php.ini. Если директивы задаются в контексте конструкции [HOST=...], они имеют ту же силу, что и при указании php_admin_value. Говоря проще, к изменению недоступны.

Возможно об этом где-то написано на php.net, но лично я не увидел. Узнано экспериментальным путëм.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Если задача обеспечить бесперебойную работу и защиту - они должны работать от разных пользователей с разными пулами php-pfp, запущенными от тех-же разных пользователей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы