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:
+17
-4
@@ -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';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user