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

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

function getIp(): string
{
	if (isset($_SERVER['REMOTE_ADDR'])) {
		$ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
	} else {
		$ip = '127.0.0.1';
	}
	return $ip;
}

Mnohem lepší tedy je:

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.

$blackList = [
	'prvni-ip',
	'druha-ip',
];

if (\in_array(getIp(), $blackList, true)) {
	echo 'Bohužel máš blokovanou ip adresu :-('; 
} 

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

Potřebujete poradit s PHP?

Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo přes Skype.

Napište mi na mail jan@barasek.com a domluvíme si schůzku.

Pomohl Vám tento článek?

TopList counter