Значення за замовчуванням у PHP розраховані на зручність розробки. Для продакшену частину треба змінити.
Не розкривати інформацію:
expose_php = Off ; без заголовка X-Powered-By: PHP/8.5.x
display_errors = Off ; помилки не виводяться користувачу
display_startup_errors = Off
log_errors = On ; але записуються в журнал
error_reporting = E_ALL
Точна версія PHP у заголовку підказує зловмиснику, які відомі вразливості перевіряти. Виведені помилки розкривають шляхи файлів і фрагменти коду.
Обмежити ресурси (захист від виснаження):
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
post_max_size = 20M
upload_max_filesize = 10M
max_input_vars = 1000
Вимкнути небезпечне:
allow_url_include = Off ; include за URL - класичний шлях до виконання чужого коду
allow_url_fopen = Off ; якщо застосунку не потрібно (HTTP-клієнти працюють через curl)
disable_functions - вимкнути функції виконання команд (exec, shell_exec, system, passthru, proc_open, popen), якщо застосунок їх не використовує. Обережно: Laravel-черги, Horizon, деякі пакети й команди artisan можуть потребувати proc_open - перевіряти, а не вимикати наосліп. Для CLI і FPM можна мати різні налаштування.
open_basedir обмежує каталоги, доступні PHP. Корисно на спільному хостингу, але це не межа безпеки (історично обходилося) і помітно сповільнює роботу з файлами. У контейнерах і на виділених серверах ізоляцію краще робити засобами ОС.
Сесії (якщо використовується нативна сесія PHP):
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
session.cookie_samesite = Lax
Laravel має власну систему сесій з налаштуваннями в config/session.php, тож тут важливіше перевірити її.
OPcache для продакшену: opcache.validate_timestamps = 0 (швидкість), але тоді після деплою OPcache треба скидати - інакше працюватиме старий код, включно з невиправленою вразливістю.
Актуальна версія PHP - найважливіше налаштування: версії, що не отримують виправлень безпеки, мають відомі невиправлені вразливості.