У Laravel-проєкті кореневий каталог сайту (document root) - лише public/. Там лежать index.php і зібрані ассети. Усе інше - код, .env, storage/, vendor/, .git/ - має бути поза доступом вебсервера.
Типова помилка - document root вказує на корінь проєкту:
root /var/www/shop; # неправильно
root /var/www/shop/public; # правильно
Тоді за прямими посиланнями доступні:
/.env- паролі до бази,APP_KEY, ключі API. Сканери перевіряють цей шлях на мільйонах сайтів щодня;/.git/- з каталогу.gitінструменти на кшталтgit-dumperвідновлюють увесь вихідний код і історію комітів, включно з колись видаленими секретами;/storage/logs/laravel.log- стеки помилок, інколи персональні дані;/composer.json,composer.lock- точні версії залежностей для пошуку відомих вразливостей;- резервні копії й дампи (
backup.sql,.env.bak,index.php~), залишені в публічних каталогах.
Як захиститися:
- document root =
public/- головне правило; - у Nginx - заборона прихованих файлів, крім
.well-known(потрібен для сертифікатів Let's Encrypt іsecurity.txt):
location ~ /\.(?!well-known).* {
deny all;
}
- не класти в
public/нічого, крім того, що має бути публічним. Файли користувачів - черезstorage:linkлише для публічного диска, приватні - через контролер з перевіркою прав; - не деплоїти
.gitна сервер, якщо він не потрібен (збірка артефакту в CI); - регулярна перевірка ззовні:
curl -I https://example.com/.envмає повертати404чи403. Такі перевірки варто додати в моніторинг.
WAF-правила (наприклад, у Cloudflare), що блокують запити до .env, .git, wp-admin, phpmyadmin, - корисний додатковий рубіж, але не заміна правильному document root.