Poprawka botto bar i wersje językowe

This commit is contained in:
2026-09-25 17:39:44 +02:00
parent 3056eb6c3d
commit a381ad09d8
21 changed files with 770 additions and 428 deletions
+40 -6
View File
@@ -1,17 +1,51 @@
<?php
/**
* Adres IP klienta (pierwszy z X-Forwarded-For lub REMOTE_ADDR).
* Czy REMOTE_ADDR to lokalny hop / reverse proxy, któremu wolno
* przekazać prawdziwy IP klienta w X-Forwarded-For.
*/
function isTrustedForwardingHop(string $remoteAddr): bool
{
$ip = normalizeClientIp($remoteAddr);
if ($ip === '') {
return false;
}
if (in_array($ip, ['127.0.0.1', '::1'], true)) {
return true;
}
// Proxy / Apache na LAN restauracji (goście Wi‑Fi widziani jako 10.x w XFF)
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
foreach (['10.0.0.0/8', '192.168.0.0/16', '172.16.0.0/12'] as $cidr) {
if (ipv4InCidr($ip, $cidr)) {
return true;
}
}
}
return false;
}
/**
* Adres IP klienta.
* X-Forwarded-For uznajemy wyłącznie, gdy połączenie przychodzi z zaufanego
* hopa (localhost / LAN) — inaczej każdy w internecie mógłby podrobić IP
* i ominąć geo. Bezpośredni dostęp z internetu = samo REMOTE_ADDR.
*/
function getRequestClientIp(): string
{
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$parts = explode(',', (string) $_SERVER['HTTP_X_FORWARDED_FOR']);
$remote = trim((string) ($_SERVER['REMOTE_ADDR'] ?? ''));
return trim($parts[0]);
if (isTrustedForwardingHop($remote) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$parts = explode(',', (string) $_SERVER['HTTP_X_FORWARDED_FOR']);
$forwarded = normalizeClientIp(trim($parts[0]));
if ($forwarded !== '' && filter_var($forwarded, FILTER_VALIDATE_IP)) {
return $forwarded;
}
}
return trim((string) ($_SERVER['REMOTE_ADDR'] ?? ''));
return normalizeClientIp($remote);
}
/**
@@ -43,7 +77,7 @@ function getGeoBypassTrustedIps(): array
}
/**
* Pule wewnętrznych sieci — goście widziani przez lokalny serwer (REMOTE_ADDR z LAN).
* Pule wewnętrznych sieci — goście na Wi‑Fi restauracji.
*/
function getGeoBypassTrustedCidrs(): array
{