Zjištění IP adresy uživatele v PHP

1 echo 'Víte že, vaše IP adresa je ' . $_SERVER['REMOTE_ADDR'] . '?';

Pozor: Zjištění IP adresy jako klíče pole $_SERVER['REMOTE_ADDR'] je možné pouze v případě, že bylo PHP voláno z prohlížeče. V client režimu (například spuštění z Terminálu cronem) není IP adresa k dispozici (dává to smysl, protože nebyl položen žádný request).

Spolehlivé zjištění IP adresy

1 function getIp(): string
2 {
3     if (isset($_SERVER['REMOTE_ADDR'])) {
4         $ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
5     } else {
6         $ip = '127.0.0.1';
7     }
8     return $ip;
9 }

Mnohem lepší tedy je:

1 echo 'Víte že, vaše IP adresa je ' . getIp() . '?';

Pokud se IP podaří zjistit, nebo je pouze IPv6, nebo jde o CLI režim (například cron), vrací se 127.0.0.1 (localhost).

Implementace zohledňující hlavičky X-Forwarded-For a X-Real-IP je přímo v PHP extrémně nebezpečná, protože může snadno dojít k modifikaci dat a útočník může podstrčit falešnou IP adresu a tím například zobrazit administraci, nebo aktivovat Debug mód webu (Nette Tracy).

Jediné správné řešení je zajistit na Apache (pomocí RemoteIP rozšíření) a v Nginx přes remote_ip rozšíření, aby se X-Forwarded-For nastavovalo ze skutečné IP adresy návštěvníka a nebylo možné IP adresu nastavit HTTP hlavičkou.

Do pole $_SERVER['REMOTE_ADDR'] se automaticky dostává správná IP adresa a nemusíme to řešit.

Blokace IP adresy návštěvníka

Ideální řešení je vytvoření seznamu blokovaných IP adres a při každém requestu tento seznam porovnat s aktuální IP adresou. Pokud se adresy shodují, bude request ihned zastaven.

1 $blackList = [
2     'prvni-ip',
3     'druha-ip',
4 ];
5 
6 if (\in_array(getIp(), $blackList, true)) {
7     echo 'Bohužel máš blokovanou ip adresu :-(';
8 }

Ukázka předpokládá implementaci funkce getIp() jako je v ukázce výše.

Sponzorované odkazy
Pomohl Vám tento článek?