Там было много из говорить о вопросе безопасности по отношению к опции PHP используется с Nginx ( как правило , PHP-FPM, быстро CGI). cgi.fix_pathinfo
В результате файл конфигурации nginx по умолчанию говорит:
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
Однако теперь «официальная» вики Nginx утверждает, что PATH_INFO может обрабатываться корректно, не отключая вышеуказанную опцию PHP. И что?
Вопросов
- Можете ли вы объяснить, что делает
cgi.fix_pathinfo
? ( официальный документ просто говорит : «Для получения дополнительной информации о PATH_INFO см. спецификации CGI») - Что PHP действительно делать с этим
PATH_INFO
иSCRIPT_FILENAME
переменными? - Почему и как это может быть опасно с Nginx? ( подробные примеры)
- Проблема все еще существует в последних версиях этих программ?
- Апач уязвим?
Я пытаюсь понять проблему на каждом этапе. Например, я не понимаю, почему с помощью сокета php-fpm Unix можно избежать этой проблемы.
Ответы:
TL; DR - исправление (которое вам может даже не понадобиться) ОЧЕНЬ ПРОСТО и в конце этого ответа.
Я постараюсь ответить на ваши конкретные вопросы, но ваше неправильное понимание того, что такое PATH_INFO, делает вопросы немного неправильными.
Первый вопрос должен быть «Что это за бизнес информация о пути?»
Информация о пути - это материал после сценария в URI (должен начинаться с косой черты, но заканчивается перед аргументами запроса, которые начинаются с a
?
). Последний абзац в разделе обзора статьи Википедии о CGI подытоживает это. НижеPATH_INFO
находится "/ ЭТО / ЕСТЬ / ПУТЬ / ИНФО":http://example.com/path/to/script.php/THIS/IS/PATH/INFO?query_args=foo
Ваш следующий вопрос должен был звучать так: «Как PHP определяет, что
PATH_INFO
иSCRIPT_FILENAME
как?»PATH_INFO
, поэтому то, что предполагалось,PATH_INFO
было спрятаноSCRIPT_FILENAME
, а во многих случаях оно нарушалось . У меня нет достаточно старой версии PHP для тестирования, но я полагаю, что онаSCRIPT_FILENAME
выглядела так: «/path/to/script.php/THIS/IS/PATH/INFO» в приведенном выше примере (с префиксом докрут как обычно).PATH_INFO
иSCRIPT_FILENAME
получает только ту часть, которая указывает на запрашиваемый скрипт (разумеется, с префиксом docroot).PATH_INFO
, им пришлось добавить параметр конфигурации для новой функции, чтобы люди, запускающие сценарии, которые зависели от старого поведения, могли запускать новые версии PHP. Вот почему есть даже переключатель конфигурации для него. Он должен был быть встроенным (с «опасным» поведением) с самого начала.Но как PHP знает, какая часть скрипта и какая информация о пути к нему? Что делать, если URI что-то вроде:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
SCRIPT_FILENAME
был определен иPATH_INFO
получает остальное.SCRIPT_FILENAME
получает" /foo.jpg " (опять же с префиксом docroot) иPATH_INFO
получает "/nonexistent.php".Почему и как это может быть опасно, теперь должно быть понятно:
Nginx и Apache могут быть построены или настроены для предотвращения запросов, использующих эту хитрость, и существует множество примеров того, как это сделать, в том числе в ответе пользователя user2372674 . Эта статья блога хорошо объясняет проблему, но в ней отсутствует правильное решение.
Тем не менее, лучшим решением будет просто убедиться, что PHP-FPM настроен правильно, чтобы он никогда не выполнял файл, если он не заканчивается на «.php». Стоит отметить, что в последних версиях PHP-FPM (~ 5.3.9 +?) Это по умолчанию, так что эта опасность больше не является проблемой.
Решение
Если у вас последняя версия PHP-FPM (~ 5.3.9 +?), То вам ничего не нужно делать, поскольку приведенное ниже безопасное поведение уже используется по умолчанию.
В противном случае найдите
www.conf
файл php-fpm (возможно/etc/php-fpm.d/www.conf
, зависит от вашей системы). Убедитесь, что у вас есть это:Опять же, это по умолчанию во многих местах в эти дни.
Обратите внимание, что это не мешает злоумышленнику загрузить файл «.php» в папку загрузки WordPress и выполнить его, используя ту же технику. Вы все еще должны иметь хорошую безопасность для своих приложений.
источник
SCRIPT_FILENAME
есть, почемуfastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
в моейnginx
конфе есть строка ? Переопределяет ли это усилие PHP по самостоятельному обнаружению ценностиSCRIPT_FILENAME
?security.limit_extensions
? Я попробовалphpinfo()
,ini_get(security.limit_extensions)
иini_get_all()
без успеха.По сути, без этого вы можете загрузить файл с php-кодом с именем «foo.jpg» на веб-сервер; тогда запросите это как http: //domain.tld/foo.jpg/nonexistent.php и стек веб-сервера ошибочно скажет о; это PHP; Мне нужно обработать это, он не сможет найти foo.jpg / nonexistent.php, поэтому он вернется к foo.jpg и обработает foo.jpg как код php. Это опасно, так как это открывает систему для очень легкого вторжения; любое веб-приложение, позволяющее загружать изображения, например, становится инструментом для загрузки бэкдора.
Что касается использования php-fpm с сокетом unix, чтобы избежать этого; ИМО это не решит проблему.
источник
cgi.fix_pathinfo
это не опасно, так как конф по умолчаниюphp-fpm
является безопасным (он будет выполнять только файлы с.php
расширением).В вики Nginx в качестве меры безопасности
входит в блок местоположения. В других уроках
используется, что должно сделать то же самое, но может создать проблемы в соответствии с вики Nginx. С этими опциями
cgi.fix_pathinfo=1
больше проблем не должно быть. Более подробную информацию можно найти здесь .источник