Récupérer et stocker l’adresse IP d’un visiteur

Il peut être utile de garder une trace de l’adresse IP d’un point de vue de sécurité ou lorsqu’on souhaite rediriger un visiteur sur base géographique*.

Voici donc comment récupérer une adresse IP distante dans le langage PHP et la stocker dans une base de données.

La première manière de récupérer l’adresse IP est la suivante:

$ip = @$REMOTE_ADDR;

$REMOTE_ADDR est une variable globale qui est pré-initialisée lors du chargement de page. L’arobase ici est utilisé pour masquer d’éventuelles erreurs lors de la récupération du contenu de la variable. Cette manière ne fonctionne que si register_global est vrai au niveau du fichier ini, ce règlage pouvant être vérifié en consultant phpinfo (consultez cette page du manuel pour la création d’un fichier phpinfo). Lorsque register_global est faux on utilise cette seconde approche:

$ip = $_SERVER['REMOTE_ADDR'];

Il s’agit ici d’explicitement récupérer la valeur de REMOTE_ADDR auprès du serveur. Si vous souhaitez avoir une plus grande flexibilité il suffit de constituer la fonction suivante.

function getRemoteIp(){
    if( !ini_get('register_globals') ) {
            return $_SERVER['REMOTE_ADDR'];
    } else {
        return @$REMOTE_ADDR;
    }
 
    return "";
}

Pour le stockage, il existe plusieurs possibilités mais le PHP fournit les deux fonctions assez intéressantes que sont ip2long et long2ip. Celles-ci permettent de respectivemment transformer une addresse IPv4 en entier long et d’effectuer l’opération inverse. Si vous utilisez MySQL il existe les fonctions équivalentes inet_aton et inet_ntoa.

Dans PHP
$ip = ‘127.0.0.1’;
$ip_value = ip2long($ip);
echo $ip_value;
echo long2ip($ipValue);

// Informations supplémentaires
$nom_page = « La page de toto »;
$heure = time();
$ip = getRemoteIp();
$sql = « INSERT INTO visiteurs(heure, ip, nom_page) VALUES (‘$heure’,$ip’,’$nom_page’) »;
$test = mysql_query( $sql );

A tester dans MySQL
select inet_aton(‘127.0.0.1′)
select inet_ntoa(‘2130706433′)

Pour le stockage dans une table SQL vous pouvez utiliser ces définitions de champ la deuxième étant la plus intéressante pour minimiser le volume de stockage nécessaire. Assurez-vous bien que le deuxième champ soit défini en tant que entier non signé car autrement une addresse IP dont le premier nombre est supérieur à 128 sera tronqué lors d’une conversion à une valeur maximale de (2^31)–1.

`ip` varchar(15) NOT NULL default  » COMMENT ‘IPv4′,
`ip_valeur` int(11) unsigned NOT NULL DEFAULT 0 COMMENT ‘Non signé’,

* Consultez cet article de Hugo ETIEVANT pour savoir comment utiliser le IP-to-Country.

– James Poulson.