Довірені проксі. Якщо перед застосунком стоїть балансувальник чи CDN (Cloudflare, AWS ALB, Nginx), справжні IP клієнта, протокол і хост приходять у заголовках X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host. Laravel використовує їх, лише якщо проксі довірений:
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: ['10.0.0.0/8']); // адреси своїх балансувальників
// $middleware->trustProxies(at: '*'); // лише якщо застосунок недоступний напряму
})
Без налаштування: $request->ip() повертає IP балансувальника - ліміти частоти діють на всіх клієнтів разом, логи марні; $request->secure() - false, і генеруються http:// посилання.
З at: '*', коли застосунок доступний і напряму: будь-хто надсилає X-Forwarded-For: 1.2.3.4 - і обходить ліміти частоти за IP, підробляє адреси в журналах аудиту.
Довірені хости. TrustHosts у Laravel за замовчуванням вимкнений - застосунок приймає запити з будь-яким заголовком Host, якщо вебсервер їх пропускає.
Отруєння посилання скидання пароля (host header injection):
- зловмисник надсилає запит на скидання пароля для email жертви з підробленим заголовком
Host: evil.example; - якщо URL у листі будується з хоста поточного запиту, жертва отримує справжній лист від вашого сервісу з посиланням
https://evil.example/reset-password/{token}; - жертва переходить - токен потрапляє до зловмисника, і він скидає пароль.
Те саме з будь-якими абсолютними посиланнями, згенерованими з запиту: підтвердження email, запрошення, посилання в кешованих сторінках (отруєння кешу).
Захист:
$middleware->trustHosts(at: ['laravelukraine.com'], subdomains: true);
trustHosts()- запити з іншимHostвідхиляються;- вебсервер приймає лише свої домени (без «default server», що обслуговує будь-який хост);
- посилання в листах і фонових задачах - з
APP_URL(URL::forceRootUrl(config('app.url'))для черг і консолі, де запиту немає); URL::forceScheme('https')на продакшені за проксі, якщо схему не можна надійно визначити.
Перевірка: curl -H 'Host: evil.example' https://ваш-сайт/forgot-password - відповідь має бути помилкою, а не нормальною сторінкою.