I. Généralités

Internet est connu pour être un espace de liberté où l'on peut surfer anonymement.

Depuis quelques années, le commerce électronique connaît un fort développement et la pub en ligne est une source de revenus importante. Les publicitaires déploient beaucoup d'efforts pour profiler les visiteurs, mais avec une efficacité toute relative. Le pays de provenance des visiteurs est ainsi une information stratégique pour mieux analyser la fréquentation d'un site, pour savoir dans quelle langue afficher une publicité...

La société Directi - société d'enregistrement de noms de domaines accréditée par l'ICANN - propose un service nommé Ip-to-country qui permet de connaître le pays d'origine d'un internaute en fonction de son adresse IP. Son offre gratuite se décline en deux volets :

  • un service web interactif
  • une base de données à télécharger
Image non disponible Image non disponible

Ce service est fiable à 98% et permet d'offrir les fonctionnalités suivantes :

  • formater correctement les données (monnaies, nombres, dates...)
  • ciblage publicitaire
  • internationalisation des pages
  • détection de fraude à la carte bancaire
  • gestion des droits d'accès
  • géolocalisation des visiteurs
  • etc.

II. Le WebService IP-to-Country

Un web service ("service web" en français) est un service en ligne distant géré par une société et interagissant avec les scripts de n'importe quel autre site web.

On peut demander au site htpp://www.ip-to-country.com le pays correspondant à une IP via la méthode GET du protocole HTTP. Cette connexion requiert une authentification avec l'identifiant guest et le mot de passe guest.

Pour effectuer cette requête en PHP, il faut procéder ainsi :

  1. ouvrir une socket avec fsockopen()
  2. envoyer la requête au travers de la socket avec fputs()
  3. et lire avec fgets() le résultat retourné par le serveur

La socket doit être ouverte sur le serveur www.ip-to-country.com et la requête se décompose en la directive GET sur la ressource "/get-country/?ip=".$ip2."&user=guest&pass=guest où $ip2 est l'adresse IP traduite en un nombre unique (sans les points de séparation des 4 champs codés sur 8 bits) et l'autre directive Host rappelant le domaine du serveur : ip-to-country.com.

Exemple :

 
TéléchargerCacher/Afficher le codeSélectionnez

II-A. Format du nom du pays

Image non disponible

Le résultat renvoyé par le serveur ip-to-country.com est le code ISO-3166 du pays associé à l'adresse IP soumise. Ce code correspond à une norme internationale définie par l'International Organization for Standardization (aller directement à la page norme ISO-3166 en français).

"Ces noms de pays sont ceux notifiés officiellement par les pays concernés au Secrétaire général de l'ONU. Cette origine permet de préserver la neutralité politique de la norme et est l'un des facteurs déterminants de l'acceptation mondiale que connaît aujourd'hui l'ISO 3166.", ISO.ch.

II-B. Format de l'adresse IP

L'adresse IP doit être transformée en un nombre avant d'être envoyée au serveur ip-to-country.com car les points sont des caractères spéciaux qui ne peuvent être envoyés directement dans l'URL, pour cela utiliser la fonction de transformation ci-bas. Une adresse IP est de la forme A.B.C.D, le nombre correspondant est de la forme : A * (256*256*256) + B * (256*256) + C * 256 + D.

 
TéléchargerCacher/Afficher le codeSélectionnez

La fonction inverse permettant de revenir à la forme avec des points est la suivante :

 
TéléchargerCacher/Afficher le codeSélectionnez

II-C. Exemple

Suite à la requête, voici ce que retourne le serveur :

 
TéléchargerCacher/Afficher le codeSélectionnez

dont il faut extraire le nom du pays, c'est facile c'est la dernière ligne qu'on extrait de la façon suivante :

 
TéléchargerCacher/Afficher le codeSélectionnez

Exemple : d'après votre adresse IP 81.48.177.151 transformée en 1362145687, votre pays d'origine est : France

II-D. Limites du service web

Utiliser le service web implique de pouvoir utiliser les sockets, ce que la configuration de votre serveur ne permet peut-être pas. De plus, en cas d'interruption de service du serveur ip-to-country.com ou bien d'aléas dans les performances du réseau vers les États-Unis (où est localisé leur serveur), il n'est plus possible de déterminer le pays d'un visiteur.

De plus, il peut être préférable pour des raisons de performances (ou autres) d'avoir sur son propre serveur toutes les données nécessaires à la résolution du nom de pays des visiteurs.

Pour toutes ces raisons il peut s'avérer utile de télécharger la base de données de ip-to-contry.com

Mise à jour (03 juillet 2010) : le service n'est temporairement plus accessible en ligne, il reste donc le mode local à exploiter.

III. La base de données de IP-to-Country

III-A. Téléchargement

Le site ip-to-country.com propose aussi de télécharger sa base de données au format CSV (fichier texte dont le séparateur de champs est la virgule, le séparateur de ligne \n et les champs sont encadrés par des doubles quotes). Dont une copie miroir se trouve ici : March-2003.zip (161 ko).

III-B. Structure de la base

Cette base de données est constituée d'une table associant un pays à des plages d'adresses IP. Ces adresses IP sont codées en un nombre comme vu plus haut. Les pays sont identifiés par leur code sur deux lettres ainsi que leur nom complet anglais dans la norme ISO-3166.

La structure de la table de la base est la suivante :

 
TéléchargerCacher/Afficher le codeSélectionnez

III-C. Exemple

Voici quelques lignes de cette table :

IP_FROM IP_TO COUNTRY_CODE COUNTRY_NAME
1042284544 1042292735 CH SWITZERLAND
1042292736 1042317311 UK UNITED KINGDOM
1042317312 1042350079 PL POLAND
1042350080 1042415615 RU RUSSIAN FEDERATION
1042415616 1042546687 FR FRANCE
1042546688 1042677759 ES SPAIN
1042677760 1042743295 GR GREECE
1042743296 1042808831 FR FRANCE
1042808832 1042817023 DE GERMANY
1042817024 1042825215 IE IRELAND
1042825216 1042833407 CZ CZECH REPUBLIC

Ainsi la plage des adresses de 62.32.0.0 (codée en 1042284544) à 62.32.31.255 (codée en 1042292735) correspondent à la Suisse (SWITZERLAND).

III-D. Interrogation

L'interrogation en langage SQL est relativement simple, voici un exemple de requête :

 
TéléchargerCacher/Afficher le codeSélectionnez

où $ip2 est l'adresse IP du visiteur codée numériquement.

III-E. Noms en français

Dans la norme ISO-3166, les noms de pays sont en anglais, le site iso.ch permet de télécharger les noms en français, ce qui permet de modifier la base de données afin d'afficher le nom du pays en français.

IV. Limites de cette méthode

Cette méthode se base exclusivement sur l'adresse IP qu'utilise le visiteur pour se connecter à Internet. Or les grands groupes mondiaux centralisent bien souvent leurs accès au Net par continents sur un seul site auquel sont reliées toutes les machines du groupe. Et c'est ainsi une seule et même plage d'adresses IP qui est répartie entre toutes les machines connectées de plusieurs pays. Alors notre méthode tombe à l'eau car le pays d'origine ainsi déterminé est celui de la connexion unique centralisée et pas celui de la machine cliente.

V. Alternatives

Il existe d'autres moyens de connaître le pays d'origine de l'internaute, par exemple, la variable d'environnement $_SERVER["HTTP_ACCEPT_LANGUAGE"] du serveur retourne la langue du client, qui dépend de la configuration du navigateur de l'internaute (donnée non fiable). Cet artifice ne permet pas - en revanche - de distinguer le visiteur parlant anglais connecté depuis une machine en Angleterre ou depuis son hôtel au Congo...

VI. Conclusion

Cette méthode offerte par "IP to Country" de Directi permet sans doute de déterminer le pays d'origine de l'internaute dans la majorité des cas, mais certaines plages minoritaires d'adresses IP ne sont pas référencées ou ne permettent pas de connaître le pays réel d'origine. Cependant, en l'absence d'autre solution plus fiable, ce service semble un outil utile et performant.

Remerciements à Youri.ch et à jérôme pour leurs remarques constructives ; ainsi qu'à stessy et à Alacazam pour la correction orthographique.