Respektovat X-Forwarded-For za reverzní proxí (Nginx Proxy Manager)

Bez TRUST_PROXY_HEADERS=true by rate limiting viděl u každého požadavku
IP proxy místo skutečného návštěvníka a limit by se sdílel napříč všemi
uživateli. Přidán i návod na zapojení do Nginx Proxy Manageru v README.
This commit is contained in:
2026-08-05 12:05:04 +02:00
parent 8763e245f5
commit b1d3e255e0
3 changed files with 59 additions and 10 deletions
+17 -4
View File
@@ -3,10 +3,23 @@ declare(strict_types=1);
function client_ip(): string
{
// Uprav podle své infrastruktury: pokud web běží za reverzní proxy
// (nginx proxy_pass, Cloudflare, ...), musíš X-Forwarded-For nastavit
// a validovat důvěryhodně na úrovni proxy, jinak si ji klient může
// vymyslet sám. Bez proxy je REMOTE_ADDR spolehlivý zdroj.
// Za reverzní proxy (Nginx Proxy Manager, Cloudflare, ...) je
// REMOTE_ADDR vždy IP proxy, ne návštěvníka — rate limiting by tak
// omylem sdílel jeden limit pro úplně všechny. TRUST_PROXY_HEADERS=true
// v .env zapíná čtení X-Forwarded-For; zapínej ho JEN pokud je tenhle
// web dostupný z internetu výhradně přes tu proxy (Apache port 80 by
// neměl být veřejně dosažitelný přímo), jinak si klient IP jednoduše
// vymyslí a rate limiting úplně obejde.
if (env('TRUST_PROXY_HEADERS', 'false') === 'true') {
$forwardedFor = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? '';
if ($forwardedFor !== '') {
$first = trim(explode(',', $forwardedFor)[0]);
if (filter_var($first, FILTER_VALIDATE_IP)) {
return $first;
}
}
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : '0.0.0.0';
}