Секрети - паролі до бази, APP_KEY, ключі API, токени платіжних систем - не повинні жити в коді. У Laravel їх зберігають у файлі .env, який:
- ніколи не комітиться - він уже є в
.gitignoreстандартного проєкту; - має шаблон
.env.exampleу репозиторії - з назвами змінних, але без справжніх значень; - на сервері доступний лише користувачу, від якого працює застосунок (
chmod 600), і лежить поза публічним каталогом (public/).
У коді секрети читаються лише через конфігурацію: config('services.stripe.secret'), а env() - тільки у файлах config/*.php. Після php artisan config:cache виклики env() поза конфігурацією повертають null.
Якщо .env потрапив у Git (навіть на хвилину, навіть у приватний репозиторій):
- вважати всі секрети з файлу скомпрометованими і змінити їх - згенерувати нові ключі API, паролі до бази, новий токен бота. Це головний крок;
- видалити файл з репозиторію й додати в
.gitignore; - за потреби переписати історію (
git filter-repo) - але це вже другорядне: копія могла лишитися у форках, клонах, кешах CI, на GitHub у вигляді доступних за хешем комітів.
Видалення файлу без ротації ключів нічого не захищає - автоматичні сканери знаходять секрети в публічних репозиторіях за лічені хвилини.
Профілактика:
- сканування секретів перед пушем: GitHub secret scanning з push protection,
gitleaksчиtrufflehogу pre-commit або CI; - окремі ключі для кожного оточення (локальне, staging, продакшен) - витік локальних ключів не зачіпає продакшен;
- ключі з найменшими правами - токен, якому потрібно лише читати, не повинен уміти писати;
- для командної роботи - зашифрований
.env(php artisan env:encrypt) чи менеджер секретів, а не пересилання файлу в месенджері.