Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

IP, IP, IP, houra !

Très souvent, je vois des gens qui recherchent des informations sur la possibilité de récupérer l'adresse IP de l'utilisateur d'un site Internet pour effectuer des contrôles et des limitations. A chaque fois on répond : "L'IP n'est pas utilisable !"

PHP met à disposition trois variables permettant d'obtenir l'adresse IP de l'utilisateur
  • $_SERVER['REMOTE_ADDR']
  • $_SERVER['HTTP_VIA']
  • $_SERVER['HTTP_X_FORWARDED_FOR']
Si vous êtes connectés directement au site sans utiliser de serveur proxy, seul "REMOTE_ADDR" est définie.

C'est quoi un serveur "proxy" ?

En français, on appelle ça un serveur mandataire. C'est un serveur qui se place comme intermédiaire entre vous et le serveur que vous contactez. Lorsque vous demandez la page d'un site, en fait, la requête est envoyée au serveur proxy et c'est lui qui va effectuer la requête sur le site Internet et vous renvoyer le résultat. Si le serveur proxy a déjà effectué la même requête pour un autre utilisateur, il peut directement vous renvoyer le résultat sans contacter le site Web, et vous gagnez ainsi du temps, surtout si le serveur proxy est en France et le site contacté en Australie. Bien sûr, si vous êtes le seul à l'utiliser, vous ne gagnerez rien. Plus un serveur proxy dispose d'utilisateurs plus vous aurez de chance qu'une page existe déjà.

Pour exploiter un proxy, vous devez configurer votre navigateur en lui indiquant l'adresse du serveur proxy. Tous les navigateurs proposent de configurer le proxy. Certains fournisseurs d'accès utilisent un serveur proxy (Noos par exemple) et vous n'avez pas besoin de configurer votre navigateur.

Donc comme c'est le proxy qui contacte mon site Web, c'est son adresse IP que je récupère !

Oui, en effet REMOTE_ADDR contient l'adresse IP du proxy, mais normalement il envoie aussi l'adresse IP de l'utilisateur que l'on retrouve dans la variable HTTP_X_FORWARDED_FOR. La variable HTTP_VIA est identique à REMOTE_ADDR et contient l'adresse IP du proxy.

Seulement, vous vous doutez bien que certains petits malins ont développés des proxy qui ne respectent pas cette règle. Ainsi, voilà ce que l'on peut avoir :

Proxy transparent (proxy normal)
Variable Adresse IP
REMOTE_ADDR adresse IP du proxy
HTTP_VIA adresse IP du proxy
HTTP_X_FORWARDED_FOR adresse IP de l'utilisateur
Proxy anonyme
Variable Adresse IP
REMOTE_ADDR adresse IP du proxy
HTTP_VIA adresse IP du proxy
HTTP_X_FORWARDED_FOR adresse IP du proxy
Proxy aléatoire
Variable Adresse IP
REMOTE_ADDR adresse IP du proxy
HTTP_VIA adresse IP du proxy
HTTP_X_FORWARDED_FOR une adresse IP aléatoire à chaque requête
Proxy hautement anonyme
Variable Adresse IP
REMOTE_ADDR adresse IP du proxy
HTTP_VIA (rien)
HTTP_X_FORWARDED_FOR (rien)

Oui .. bon .. ceux qui utilisent des proxy anonymes, j'en ai rien à faire, tant pis pour eux !

Sur terre, les paranos sont de plus en plus nombreux, et ils n'aiment pas qu'on puisse les identifier. Mais certains font aussi ça pour passer vos protections.

Imaginons que vous mettiez en place un système de vote et que vous limitiez un vote par adresse IP, il suffit d'utiliser un proxy aléatoire et je peux voter un grand nombre de fois.

De plus, beaucoup d'utilisateurs qui passent par un fournisseur d'accès à Internet, changent d'adresse IP d'une connexion à l'autre. En effet, le nombre d'adresse IP n'est pas infinie et les fournisseurs d'accès ont une plage d'adresse IP qu'ils attribuent dynamiquement à la demande. Ainsi, s'ils ont 1000 adresses IP, ils peuvent avoir un peu plus de 1000 abonnés car statistiquement, il n'y aura jamais plus de 1000 utilisateurs en même temps.

Bon, mais pour un contrôle lors d'une session de navigation ?

Oui, normalement, cette adresse ne doit pas changer pendant la navigation de l'utilisateur (quoique certains utilisateurs connaissent de nombreuses déconnexions). Mais le problème vient d'ailleurs (comme la vérité), avez-vous pensez aux réseaux locaux ?

C'est à dire ?

Je vais prendre mon cas. Chez moi, je dispose de trois ordinateurs et je les ai connectés entre eux au moyen d'un routeur. Mon routeur est un appareil autonome qui se connecte à mon fournisseur d'accès et route mes requêtes vers l'extérieur, ce qui me permet de partager ma connexion Internet. Mes ordinateurs disposent d'une adresse IP "locale", c'est à dire une adresse de la forme 192.168.0.xxx. Quand je me connecte à un site web sans utiliser de serveur proxy, la variable REMOTE_ADDR correspond à l'adresse IP de mon routeur. Donc, si je me connecte avec l'un de mes trois ordinateurs, l'adresse IP est la même.

Ce genre de configuration est très courant et toutes les entreprises qui disposent d'une connexion à Internet sont soumises au même phénomène. Ainsi, en limitant l'accès à une seule adresse IP vous risquez de limiter l'accès à toute une entreprise, qu'elle soit de 10 ou 50.000 employés.

Et pour une application Intranet ?

Dans le cas d'une application pour un Intranet, vous n'avez pas ce problème en principe, mais faites attention aux sous-réseaux et aux navigateurs configurés pour utiliser un proxy.

En conclusion, ne faites pas confiance à l'adresse IP, elle ne vous sera d'aucune utilité. Mettez en place des systèmes à base de login/pass, de certificats (PKI) ou d'applet Java.

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin