Настройки PHP по умолчанию оптимизированы для разработки, а не для продакшн. На публичном сервере они раскрывают версию PHP и внутренние пути, позволяют опасные операции.
Найти php.ini
php --ini | grep "Loaded Configuration"
# /etc/php/8.3/fpm/php.ini
Обязательные настройки безопасности
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php/errors.log
expose_php = Off
open_basedir = /var/www/site/:/tmp/:/var/lib/php/sessions/
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,phpinfo
file_uploads = On
upload_max_filesize = 10M
max_file_uploads = 5
max_execution_time = 30
memory_limit = 256M
Безопасность сессий
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Strict
session.use_only_cookies = 1
session.use_strict_mode = 1
session.gc_maxlifetime = 1440
session.save_path = /var/lib/php/sessions
Проверка конфигурации
php -r "echo ini_get('expose_php');"
php -r "echo ini_get('display_errors');"
open_basedir ограничивает PHP доступом к файлам вне указанных директорий. Это блокирует атаки Path Traversal и LFI (Local File Inclusion), когда злоумышленник пытается прочитать /etc/passwd.
disable_functions можно обойти через PHP-расширения. Это дополнительный слой защиты, но не замена правильному коду и регулярным обновлениям.