Récupération d'adresse IP visiteur

ViPHP
ViPHP | 1996 Messages

31 mai 2018, 08:44

Bonjour à tous,

Je dois terminer une application WEB qui ne doit fonctionner que dans un environnement local. Ainsi l'utilisateur doit se connecter depuis un poste local (IP de classe C ie. 192.168) ou depuis un poste distant connecté en VPN (IP de classe A ie. 10.X.X).
J'ai donc créer cette méthode (inclue dans une classe) pour vérifier si l'adresse IP était locale ou localhost (tache cron sur l'application):
public function isAdresseIpLocal ($ip=false) {
	//vérifie si l'adresse IPV4 ou V6 est locale ou localhost
	if (empty($ip))
		if (!empty($_SERVER['HTTP_CLIENT_IP']))
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) 
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		elseif (isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) 
			$ip = $_SERVER['REMOTE_ADDR'];
		else {
			return false;
		}
		
	if (in_array($ip,array('127.0.0.1','::1')))
		return true;
	elseif (!filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_NO_PRIV_RANGE))
		return true;		
	elseif (!empty($this->tabIpExceptions) && is_array($this->tabIpExceptions) && in_array($ip,$this->tabIpExceptions)) 
		return true;
	else {
		return false;
	}
}

La détection en local s'effectue bien mais quand l'utilisateur se connecte en VPN via linux (uniquement linux), l'adresse IP ipV4 détectée est celle public, c'est à dire, celle d'Orange ou d'OVH par exemple.
J'ai créé un tableau d'exceptions mais cela oblige le Webmaster à vérifier si l'adresse IP public est dynamique ou statique (surtout avec Orange).
Est ce un problème de code PHP, de configuration ou de routage Linux ?
Comment tester ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 juin 2018, 12:32

Bonjour,

Fais un var_dump($_SERVER) que tu affiches depuis une connexion VPN et regarde ce que contiennent les variables pour savoir laquelle utiliser et pouvoir debuguer ensuite ton code.
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 1996 Messages

01 juin 2018, 13:45

Bonjour @rthur,

Merci déjà de m'avoir répondu.
Je l'ai déjà fais.
J’obtiens toujours avec un utilisateur Linux (Ubuntu 18.04) l'adresse public. C'est là que je ne comprends pas.
Pour étayer un peu : quand l'utilisateur est connecté en VPN (PPTP), il obtient une adresse IP de classe A délivré par le serveur du type 10.X.X.1 mais l'adresse retournée par la fonction est toujours public. Toujours non, car sous Windows 10 en mode VPN PPTP, si je purge le cache de Firefox (Firefox 60) et uniquement sous Windows, l'adresse public détectée est écrasée par l'adresse locale VPN.

Je m'interroge aussi sur le fait qu'il faille faire une action côté utilisateur sous Windows pour rafraichir côté serveur... Cela provient-il de la gestion des sessions et des cookies générés par cette gestion ?

Il y a-t-il côté PHP (ou Apache, NGINX) une gestion du cache des paramètres IP du visiteur ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 juin 2018, 00:21

La seule variable qui est normalement fiable est $_SERVER['REMOTE_ADDR'], les autres sont indicatives et peuvent être bidouillées (toutes les variables $_SERVER qui commencent par HTTP_* peuvent avoir été ajouté par le navigateur ou par un routeur sur le réseau (tel que le VPN), donc utilise uniquement $_SERVER['REMOTE_ADDR'] pour voir si le problème se pose.

$_SERVER['REMOTE_ADDR'] est une variable remplie par ton serveur (Apache ?) par l'IP qui fait la requête. Donc si tu as une IP publique c'est que la requête est vue comme telle par ton serveur.

Si tu fais une analyse des trames réseaux (par exemple avec Wireshark) de ce qui arrive sur ton serveur web, tu pourras en être sûr à 100%
Quand tout le reste a échoué, lisez le mode d'emploi...