Когда дело доходит до настройки PHP для веб-приложений, один из аспектов, который может ускользнуть от внимания, — это глобальные переменные, такие как $_ENV. Хотя они могут представляться несущественными, настройка этих переменных может оказать заметное влияние на безопасность и производительность вашего приложения. В этой статье мы рассмотрим причины, по которым решение об отключении $_ENV может быть для вас оптимальным.
Что такое $_ENV и как она настраивается?
$_ENV — это одна из предопределенных глобальных переменных в PHP, которая содержит переменные окружения. Эти переменные могут включать в себя информацию о сервере, пути к файлам, ключи API и другую конфиденциальную информацию.
Повышение безопасности
Предотвращение информационного раскрытия: Одним из основных рисков, связанных с включенным $_ENV, является потенциальное раскрытие важных данных. Если злоумышленники получат доступ к вашему приложению или если ваш код случайно выводит содержимое $_ENV, это может привести к утечке конфиденциальной информации.
Снижение риска манипуляции: Когда глобальные переменные включены, у злоумышленников больше возможностей для манипулирования входными данными, что может привести к уязвимостям безопасности.
Улучшение производительности
Оптимизация использования памяти: Любая глобальная переменная занимает некоторое количество памяти. Отключение $_ENV может немного снизить потребление памяти, особенно на серверах с ограниченными ресурсами.
Быстрое время инициализации: Каждый раз при запуске PHP-скрипта система должна инициализировать и наполнять глобальные переменные данными. Отключение ненужных переменных может сократить это время.
Что делать, если вам нужен доступ к переменным окружения?
Если вам все-таки требуется доступ к переменным окружения, не стоит расстраиваться. Функция getenv() предоставляет доступ к этой информации без необходимости включения $_ENV.
Настройка PHP-окружения — это не только о выборе версий и модулей, но и о тонкой настройке для обеспечения безопасности и производительности. Рассмотрите возможность отключения $_ENV и других глобальных переменных в вашем конкретном контексте, чтобы создать надежное и быстродействующее веб-приложение.
php.ini: настройка директивы variables_order
Если в variables_order отсутствует буква «E» (от слова «Environment»), это означает, что PHP не будет автоматически заполнять глобальный массив $_ENV данными из окружения при инициализации. Это и является причиной того, что $_ENV пуст.
Если вы хотите, чтобы $_ENV содержал данные из окружения, вы можете добавить букву «E» в variables_order. То есть:
variables_order = "EGPCS"
После этого перезапустите ваш веб-сервер или PHP-FPM (если используется), чтобы изменения вступили в силу.
Однако учтите, что изменение этой настройки может повлиять на производительность, так как теперь PHP будет заполнять еще один суперглобальный массив при каждом запросе. Если вам редко требуется доступ к переменным окружения и вы предпочитаете не изменять variables_order, вы можете продолжать использовать функцию getenv(), которая будет работать независимо от этой настройки.
«Из коробки» же настройки variables_order могут выглядеть так:
Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"
в данном случае массив $_ENV у вас будет отсутствовать. Но почему в комменте указано по дефолту EGPCS, а стоит значение GPCS?
Это вопрос дизайна конфигурации и решений, принятых разработчиками PHP.
Комментарии в php.ini обычно показывают значение по умолчанию (Default Value), которое предоставляется в исходном коде PHP. Однако реальное значение, установленное при развертывании (например, при установке пакета через менеджер пакетов в Linux), может быть определено рекомендациями разработчиков для конкретных режимов (разработка или продакшн).
В данном случае, комментарий показывает, что по умолчанию значение variables_order равно «EGPCS». Однако для настроек разработки (Development Value) и настроек продакшна (Production Value) рекомендуется значение «GPCS».
Когда вы устанавливаете PHP из некоторых репозиториев или дистрибутивов, конфигурационный файл php.ini может быть уже предварительно настроен с определенными рекомендациями, такими как «GPCS» для variables_order, вместо значения по умолчанию. Это делается, чтобы повысить безопасность или производительность «из коробки».
Таким образом, хотя значение по умолчанию «EGPCS» указано в комментариях, ваш конкретный дистрибутив или репозиторий PHP решил использовать «GPCS» для настроек как разработки, так и продакшна. В чем заключается повышение безопасности и производительности при отключении $_ENV мы обсудили в начале статьи.
Почему разработчики в cli исключили E значение и ставят variables_order = «GPCS» ведь там аспект безопасности как раз теряется во многом, я понимаю такую настройку для web использования(fpm-fpm/apache), но для cli… хотя это как посмотреть и как использовать cli…
Настройка variables_order = «GPCS» для CLI может показаться странной на первый взгляд, учитывая аргументы безопасности. Однако есть несколько возможных причин для этого:
- Ожидаемое поведение: CLI-скрипты часто пишутся разработчиками для узкоспециализированных задач, и они ожидают определенного поведения. Изменение настроек по умолчанию может вызвать непредвиденные проблемы или сбои в скриптах.
- Контролируемое окружение: CLI-скрипты, как правило, выполняются в более контролируемом окружении по сравнению с веб-приложениями. Разработчик или системный администратор обычно имеет больше контроля над тем, как и где запускаются эти скрипты, что может снизить риски, связанные с безопасностью.
- Практические соображения: Во многих случаях переменные окружения являются основным способом передачи параметров в CLI-скрипты. Отключение $_ENV может создать неудобства для разработчиков, вынуждая их использовать getenv() для каждой переменной вместо доступа к глобальному массиву.
Тем не менее, если у вас есть определенные требования к безопасности или другие соображения, связанные с вашим CLI-приложением, вы всегда можете изменить настройки php.ini для CLI в соответствии с вашими потребностями. Всегда стоит подходить к конфигурации с учетом конкретного контекста использования и требований к безопасности.