• seguici su feed rss
  • seguici su twitter
  • seguici su linkedin
  • seguici su facebook
  • cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



ricordami per 365 giorni

HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO ? CLICCA QUI E REGISTRATI !

Come ottenere in PHP l'indirizzo IP di un utente

di :: 11 giugno 2022
Come ottenere in PHP l'indirizzo IP di un utente

Spesso abbiamo l'esigenza di verificare o salvare l'indirizzo IP del visitatore per tracciarne l'attività, per motivi di sicurezza o per controllare gli accessi.

L'altro giorno ho letto un articolo relativo alla modifica delle condizioni contrattuale della web tv DAZN, che, da fine estate, limiterà la visione a 2 sole connessioni provenienti dallo stesso IP. Da questa notizia ho pensato di scrivere qualche articolo relativo a come effettuare un controllo sugli accessi del proprio sito web, iniziando dal controllo dell'indirizzo IP dell'utente.

In PHP per ottenere l'indirizzo IP di un utente si utilizza la variabile superglobale $_SERVER, che è un array contenente molte variabili create dal server.

A noi interessa questa: $_SERVER['REMOTE_ADDR']

Inseriamola in uno script php e vedremo il nostro IP visualizzato nello schermo.

<?php
echo $_SERVER['REMOTE_ADDR'];
?>

Tuttavia, non sempre $_SERVER['REMOTE_ADDR'] restituisce il corretto IP dell'utente.

Infatti, nel caso in cui l'utente navighi dietro ad un proxy, è probabile che si ottenga l'ip del proxy e non dell'utente.

Per ovviare a questo dobbiamo verificare la sua presenza anche in altre variabili, e tra queste è molto utilizzata HTTP_X_FORWARDED_FOR che utilizziamo così:

<?php
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
	$client_ip = end(explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']));
}
?>

HTTP_X_FORWARDED_FOR potrebbe contenere più indirizzi IP divisi da una virgola, nel caso in cui esistano vari proxy tra l'utente e in nostro sito: in questo caso dobbiamo prendere l'ultimo ip della lista. Abbiamo quindi "esploso" la variabile HTTP_X_FORWARDED_FOR, utilizzando la virgola come elemento di separazione, ottenendo così un array, e dopo, tramite "end", abbiamo preso l'ultimo valore dell'array.

Possiamo creare un primo script nel quale, se è presente $_SERVER['HTTP_X_FORWARDED_FOR'], utilizziamo questo per determinare l'ip, in caso contrario utilizziamo $_SERVER['REMOTE_ADDR']

<?php
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
	$client_ip = end(explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']));
}
else {
	if(!empty($_SERVER['REMOTE_ADDR'])){
		$client_ip = $_SERVER['REMOTE_ADDR'];
	}
}

echo $client_ip; 
?>

Queste due variabili tuttavia non comprono tutte le possibilità. Dobbiamo verificare la presenza dell'IP anche in altre variabile.

Creiamo quindi una funzione ad hoc

<?php

function get_client_ip() {
	$client_ip='';
	if (! empty($_SERVER['HTTP_CLIENT_IP'])) {
		// to get shared ISP IP address
		$client_ip= $_SERVER['HTTP_CLIENT_IP'];
	} 
	else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
		$ipAddressList = end(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
	}
	else if (! empty($_SERVER['HTTP_X_FORWARDED'])) {
		$client_ip= $_SERVER['HTTP_X_FORWARDED'];
	} 
	else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
		$client_ip= $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
	} 
	else if (! empty($_SERVER['HTTP_FORWARDED_FOR'])) {
		$client_ip= $_SERVER['HTTP_FORWARDED_FOR'];
	} 
	else if (! empty($_SERVER['HTTP_FORWARDED'])) {
		$client_ip= $_SERVER['HTTP_FORWARDED'];
	} 
	else if (! empty($_SERVER['REMOTE_ADDR'])) {
		$client_ip= $_SERVER['REMOTE_ADDR'];
	}
    return $client_ip;
}

$client_ip=get_client_ip();
echo $client_ip;
?>

Con questa funzione riusciamo a recuperare l'IP dell'utente.

Tuttavua l'ip può essere contraffatto tramite strumenti ad hoc, soprattutto in tutte le variabili SERVER che iniziano con "HTTP" : sono infatti "header" che possono essere aggiunti/modificati facilmente da chiunque abbiamo un minino di dimestichezza (ad esempio utilizzando Curl).

Verifica del formato dell'indirizzo IP

E' sempre bene effettuare un minimo controllo di validità dell'ip ottenuto.

A questo scopo possiamo utilizzare questa funzione che verifica se il formato IP è valido: ritorna "true" se l'ip è valido, "false" in caso contrario.

<?php
function isValidIpAddress($ip)
{
    if (filter_var($ip, FILTER_VALIDATE_IP,
        FILTER_FLAG_IPV4 |
        FILTER_FLAG_IPV6 |
        FILTER_FLAG_NO_PRIV_RANGE |
        FILTER_FLAG_NO_RES_RANGE) === false) {
        return false;
    }
    return true;
}
?>

Tramite filter_var abbiamo verificato che l'ip ottenuto rispetti alcune condizioni:

  • FILTER_VALIDATE_IP: l'ip deve essere valido
  • FILTER_FLAG_IPV4: l'ip deve essere un indirizzo IPV4
  • FILTER_FLAG_IPV6: l'ip deve essere un indirizzo IPV6
  • FILTER_FLAG_NO_PRIV_RANGE: l'ip non deve essere privato cioè non deve essere incluso in un intervallo 10.0.0.0/8 , 172.16.0.0/12 e 192.168.0.0/16
  • FILTER_FLAG_NO_RES_RANGE: l'ip non deve rientrare in questi range riservati
    IPv4: 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 and 240.0.0.0/4.
    IPv6: ::1/128, ::/128, ::ffff:0:0/96 and fe80::/10.

IP e Cloudflare

Una nota ralativa ai siti che utilizzano CloudFlare. CloudFlare, in termini tecnici, è un reverse proxy, cioè un server che si interpone tra il server che ospita il tuo sito ed il visitatore, svolgendo anche funzioni di caching dei contenuti. In poche parole salva temporaneamente in memoria i contenuti delle pagine per poterli visualizzare più velocemente.

Se utilizzate CloudFlare per il vostro sito, il $_SERVER['REMOTE_ADDR'] renderà l'ip del server e non dell'utente.

In questo caso l'IP dell'utente lo otteniamo così

<?php
$client_ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
echo $client_ip;
?>

IP e privacy policy

L'IP dell'utente è considerato un dato sensibile ai sensi del GDPR (il regolamento generale sulla protezione dei dati). Per questo motivo, se volete conservare l'IP, è opportuno informare l'utente per ottenerne il consenso.

Spero di esservi stato d'aiuto con questo articolo relativo alla modalità di recupero dell'indirizzo IP di un utente.

In un prossimo articolo vedremo come verificare il mac address di un utente.

Stay tuned!

 
 
 
 
pay per script

Hai bisogno di uno script PHP personalizzato, di una particolare configurazione su Linux, di una gestione dei tuoi server Linux, o di una consulenza per il tuo progetto?

x

ATTENZIONE