Est-ce que vous connaissez l’expression : « Dis-moi ce que tu manges et je te dirai qui tu es » ? Je suppose que oui. La variante moderne, adaptée pour internet, de cette expression serait plus : « Dis-moi quelle est ton adresse IP et je te dirais, à peu près, où tu es ».
Votre adresse IP est une donnée publique. Elle est l’identifiant unique permettant de faire le lien avec les différents serveurs web que vous allez visiter. Ceci étant dit, sachant qu’il est possible de savoir à quel pays est assigné un bloc d’adresse IP en question. Il est, par le fait même, de géolocaliser votre visite. C’est-à-dire d’être en mesure de déterminer avec une certaine précision votre provenance.
Toutefois, dans le cas qui m’intéresse, je suis uniquement intéressé par les données permettant de retrouver le pays associé à une adresse IP. Bref, uniquement des données publiques.
La recette
Lorsqu’on s’y attarde un peu, il n’est pas vraiment compliqué d’arriver à ses fins lorsqu’il est temps d’identifier le pays de provenance. Il suffit d’avoir accès à une base de données décemment bâtie et vous serez en affaires.
La précision peut effectivement varier selon les sources que vous allez utiliser. Sachez surtout que, plus le service prétend être en mesure d’identifier avec précision le positionnement d’une adresse IP, plus vous pouvez suspecter que le fournisseur a eu recours à des sources possiblement illégales.
Une base de données d’adresses IP
La compagnie MaxMind met à votre disposition une panoplie de données liées aux adresses IP, sous format CSV. Il y a notamment la base de données GeoLite Country qui permet d’avoir accès à une liste d’adresses regroupées par pays. Il faut noter que la licence d’utilisation stipule que vous devez absolument mentionner l’utilisation de MaxMind comme source de données si vous désirez être conforme.
Si cela ne vous plaît pas, vous pouvez toujours acheter la base de données pour 50$.
Interroger cette base de données
Assumons que vous avez téléchargé le fichier CSV et avez importé son contenu dans votre base de données SQL.
Les données sont présentées dans le format suivant :
« 202.81.80.0 », »202.81.95.255", »3394326528", »3394330623", »JP », »Japan »
« 202.81.96.0 », »202.81.127.255", »3394330624", »3394338815", »AU », »Australia »
« 202.81.128.0 », »202.81.159.255", »3394338816", »3394347007", »IN », »India »
Les deux colonnes qui vous intéressent sont les colonnes #3 et #4. Il s’agit de la conversion de l’adresse IP en une valeur numérique. C’est assez pratique si vous désirez comparer vos données dans les plages d’adresse IP.
Récupérer l’adresse IP d’un visiteur avec C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static IPAddress GetIp(this System.Web.HttpRequest request) | |
{ | |
string ipString; | |
if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"])) | |
{ | |
ipString = request.ServerVariables["REMOTE_ADDR"]; | |
} | |
else | |
{ | |
ipString = request | |
.ServerVariables["HTTP_X_FORWARDED_FOR"] | |
.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) | |
.FirstOrDefault(); | |
} | |
IPAddress result; | |
if (!IPAddress.TryParse(ipString, out result)) | |
{ | |
result = IPAddress.None; | |
} | |
return result; | |
} |
Comment comparer son adresse IP en valeur numérique?
Selon l’extrait de données, que j’ai indiqué plus haut, il suffit de déterminer si l’adresse IP se situe à l’intérieur d’un bloc d’adresses en particulier. Par exemple, un visiteur du Japon pourrait utiliser une adresse entre 202.81.80.0 et 202.81.95.255.
Pour y arriver, il faut comparer des bananes avec des bananes. La façon la plus simple d’y arriver et de convertir l’adresse IP en une valeur numérique. Comparer une adresse IP avec une autre sans cette valeur numérique est pratiquement impossible.
Pour y arriver, le calcul à utiliser est le suivant : (premier octet * 256³) + (second octet * 256²) + (troisième octet * 256) + (quatrième octet).
Une fois cette valeur en main, vous pouvez comparer vos valeurs numériques assez facilement. Sommairement, il en revient à faire une requête SQL utilisant l’opérateur BETWEEN.
Et puis, pour le reste? Je crois que vous serez en mesure de compléter vous-même le restant de l’histoire. Happy coding!
Très intéressant cette semaine: je ne savais pas qu’il serait nécessaire de convertir un IP en valeur numérique pour faire des comparaisons!