Connaître le pays d’une adresse IP

Il est parfois utile de pouvoir localiser géographiquement une adresse IP. Cela peu par exemple être utile pour localiser un visiteur ou pour localiser des serveurs. Cet article présente deux tutoriaux PHP qui exploite une base de donnée pour associer une adresse IP à son pays.

Base de données pays

Intérêt de localiser une adresse IP

Il y a plusieurs raisons qui motivent l’utilisation de la localisation de l’adresse IP. La liste ci-jointe n’est pas exhaustive mais inclue des exemples d’utilisations très probables:

  • Localiser le visiteur d’un site web. Avec cette information il est possible de personnaliser le contenu pour cet internaute (utiliser l’unité monétaire de son pays, suggérer une version du site dans la langue officielle de son pays …).
  • Cibler l’audience d’une annonce en ligne.
  • Détection automatique d’un champ de formulaire (exemple: choix du pays pré-remplis).
  • Connaitre l’emplacement géographique du serveur d’un site web (exemple: peut être utile pour le référencement).
  • Filtrer les visiteurs selon leur localité.
  • Réduire le spam / Réduire les fraudes bancaires.

Base de données

Pour associer une adresse IP à un pays, il faut se baser sur une base de données qui répertorie des plages d’adresses IP à un pays. La base de données de IP-to-Country (anciennement ip-to-country.com) est relativement précise, complète et mise à jour régulièrement.

Pour réaliser les tutoriaux présents dans la suite de cet article, il est indispensable de télécharger la base de données suivante et de la mettre en place sur son espace d’hébergement.

(Base de données SQL de 5,23Mo)

Pays d’origine d’un visiteur

L’utilisation la plus populaire de cette base de données consiste à localiser le pays d’origine d’un visiteur. Le code PHP suivant fonctionne avec PHP 5.

<?php
/* Message de copyright obligatoire: "This 'work' uses the IP-to-Country Database provided by WebHosting.Info (http://www.webhosting.info), available from http://ip-to-country.webhosting.info." */ // Connexion à la base de donnée (à adapter) $link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = $_SERVER['REMOTE_ADDR']; // Adresse IP du visiteur
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du visiteur

mysqli_close($link);
?>

Localisation d’un serveur

Pour une application ou pour le référencement, il peut se révéler utile de savoir dans quel pays se situe le serveur d’un site web. En connaissant le nom de domaine d’un site, le code suivant retourne l’adresse IP du serveur. Cette adresse IP peut alors permettre de localiser le serveur grâce à la base de données.

<?php
/* Message de copyright obligatoire: "This 'work' uses the IP-to-Country Database provided by WebHosting.Info (http://www.webhosting.info), available from http://ip-to-country.webhosting.info." */ // Connexion à la base de donnée (à adapter) $link = mysqli_connect("localhost", "my_user", "my_password", "my_db");

// Fonction permettant de convertir l'adresse IP en un format numérique
function ipAdressNumber($dotted){
 $dotted = preg_split( "/[.]+/", $dotted);
 $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
 // IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
 return $ip;
}

$ip = gethostbyname('www.infowebmaster.fr'); // Adresse IP du serveur du site www.infowebmaster.fr
echo 'Adresse IP: '.$ip.'<br />';
$ip = ipAdressNumber($ip); // Utilisation de la fonction pour convertir l'adresse IP

// Sélection des données dans la base de données. Si l'IP est comprise entre IP_FROM et IP_TO
$result = mysqli_query($link, "SELECT * FROM ip_to_country WHERE $ip BETWEEN IP_FROM AND IP_TO ") or die (mysqli_error($link));
$data = mysqli_fetch_array($result);
echo 'Pays: <strong>'.$data['COUNTRY_NAME'].'</strong>'; // Affichage du pays du serveur

mysqli_close($link);
?>

Il est possible de constater que ce code diffère très peu du code précédent qui consistait à déterminer le pays d’origine d’un visiteur.

Continuation

Cette base de données est très intéressante mais possède l’inconvénient d’être exclusivement en anglais. De plus, les pays sont écrits en majuscules, ce qui n’est pas très esthétiques et facile à lire. Il est possible d’améliorer ce travail en créant une base de données permettant de traduire le nom des pays.

Mise à jour 21 février 2010: Pour traduire le nom des pays en français, j’ai créé une base de données de traduction de IP-to-Country. Cela est idéal pour afficher convenablement le nom des pays aux visiteurs.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.