Mimacy Mag

Le blog généraliste qui partage les idées

[PHP] Détecter un VPN, un Proxy, un VPS ou un Serveur dédié à partir d'une adresse IP

Rédigé par admin 1 commentaire
VPN

Depuis longtemps je recherchais un truc fiable sur Index Francophone et Google pour détecter l'IP d'un visiteur en PHP afin de savoir s'il utilise un hébergeur ou un serveur dédié ou un VPS (et donc forcément il détecte aussi les VPN, PROXY et même les BNC).

J'ai donc trouvé 3 bons détecteurs de VPN (ce sont des API) :

1) Détecteur N°1 : L'API de https://iphub.info

Vous pouvez voir la démo en direct sur https://iphub.info en tapant l'IP d'un VPN tout en haut à droite du site afin de tester. L'utilisation est plutôt simple :

 

  • Il suffit de s'inscrire sur le site pour obtenir une clé API - Une version Free à 50 requêtes par minute c'est assez, il suffira juste de bidouiller le code php afin d'éviter qu'il s’exécute chez les abonnés Orange, Free, SFR etc.. car eux il faut les considérer directement comme des "block=0".
  • Récupérez votre clé API.
  • Testez ensuite ce code PHP (sans oublier d'entrer votre clé API ):

function getBooleanFAI($ip) {
 $host = @gethostbyaddr($ip); 
 $fai = false;
 if(substr_count($host, 'proxad')) $fai = true;
 if(substr_count($host, 'orange')) $fai = true;
 if(substr_count($host, 'wanadoo')) $fai = true;
 if(substr_count($host, 'sfr')) $fai = true;
 if(substr_count($host, 'club-internet')) $fai = true;
 if(substr_count($host, 'neuf')) $fai = true;
 if(substr_count($host, 'gaoland')) $fai = true;
 if(substr_count($host, 'bbox')) $fai = true;
 if(substr_count($host, 'bouyg')) $fai = true;
 if(substr_count($host, 'numericable')) $fai = true;
 if(substr_count($host, 'tele2')) $fai = true;
 if(substr_count($host, 'videotron')) $fai = true;
 if(substr_count($host, 'belgacom')) $fai = true;
 if(substr_count($host, 'bell.ca')) $fai = true;
 return $fai;
}


// ignore les FAIs
if ( getBooleanFAI($_SERVER["REMOTE_ADDR"]) == false ) {

$ip = gethostbyname($_SERVER["REMOTE_ADDR"]);
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_URL, 'http://v2.api.iphub.info/ip/'.$ip);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Key: [Entrer la clé API ici]')); // Obtenez votre clé en vous inscrivant sur https://iphub.info 
 $result = curl_exec($ch);
 curl_close($ch);

$obj = json_decode($result, true);

$isp = $obj['isp'];

if($obj['block'] == '0'){
 $block = "IP résidentielle / non classifiée (c'est-à-dire Safe IP)";
 }
 else if($obj['block'] == '1'){
 $block = "Détection d'un VPN ou PROXY ou VPS ou Serveur dédié ou hébergeur hosting...";
 }
 else if($obj['block'] == '2'){
 $block = "IP non résidentielle et résidentielle (avertissement, peut flagrant des personnes innocentes)";
 }
 else {
 $block = "Connexion inconnu";
 }

 echo $block;

}

La documentation :

Le bloc de paramètres a été conçu avec soin pour permettre à nos utilisateurs de déterminer leur propre «niveau de risque». Nous vous recommandons d'utiliser cette variable lorsque vous décidez de bloquer l'IP interrogée pour accéder à votre application.

$obj['block'] = 0 - IP résidentiel / non classifié (c'est-à-dire IP sécurisé)

$obj['block'] = 1 - IP non résidentiel (fournisseur d'hébergement, proxy, etc.)

$obj['block'] = 2 - IP non résidentiel et résidentiel (avertissement, peut flagrant des personnes innocentes)

Nous recommandons généralement aux gens d'utiliser le niveau de risque 1 (c'est-à-dire, seul bloc sur bloc == 1). Il offre le meilleur équilibre entre arrêter les utilisateurs malveillants et éviter les faux positifs.   Les variables retournées par l'API sont:

$obj['ip'] : IP du visiteur (Inutile dans mon cas car j'utilise $_SERVER['REMOTE_ADDR'] )

$obj['hostname'] : Hostname du visiteur (Le mieux c'est d'utiliser gethostbyname($_SERVER['REMOTE_ADDR']) )

$obj['countryCode'] : Code du pays du visiteur (équivalent à geoip_country_code_by_name($_SERVER['REMOTE_ADDR']) )

$obj['countryName'] : Nom du pays

$obj['asn'] : Récupère l'ASN (Autonomous System Numbers)

$obj['isp'] : Récupère l'ISP, on dirait le nom du F.A.I ou de l'hébergeur c'est assez utile.

$obj['block'] : Déjà expliqué. Le plus utile pour détecter un VPN c'est la valeur "1".

	"ip": "8.8.8.8",
	"hostname": "google-public-dns-a.google.com",
	"countryCode": "US",
	"countryName": "United States",
	"asn": 15169,
	"isp": "GOOGLE - Google Inc.",
	"block": 1

[EDIT du 22.01.2018] Mon test effectué: Depuis aôut 2017 j'utilise ce script et il test en moyenne un utilisateur toutes les 10 secondes, il n'a jamais planté mais surtout il s'est jamais trompé. Ce site est donc très fiable ! La meilleure solution serait d'utiliser directement leur source directement mais... comment font t'ils ?! J'ai bien une petite idée, il est probable qu'ils détectent tous les ISP de toutes les IPs comme "Orange", "Free", "OVH", "Dedibox"... et qu'il y a certainement 3 groupes classés considéré comme IP Fiable si c'est Orange et Free et et que le 2ème groupe calculé comme Vpn/Hosting c'est OVH et Dedibox, le 3ème groupe c'est les ISP médiocres. Il serait donc facile de trier les connexions ISP mais il faudrait d'abord trouver la solution pour récupèrer l'ISP d'une IP de façon fiable.

2) Détecteur N°2 : L'API de http://check.getipintel.net

http://check.getipintel.net/check.php?ip=xx.xx.xx.xx&contact=AdresseEmail@site.com La valeur "0" indique que l'IP est fiable (type résidentiel), la valeur "2" indique que l'IP est probablement un serveur ou un vps ou tout autres choses en rapport avec les hébergeurs comme les vpn/proxys/bnc etc... Voir la documentation complète: http://getipintel.net Les requêtes sont t'elles limitées ? Aucune idée. Voici un exemple de script PHP pour l'utiliser:



$ip = gethostbyname($_SERVER["REMOTE_ADDR"]);
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_URL, 'http://check.getipintel.net/check.php?ip='.$ip.'&contact=AdresseEmail@VotreDomaine.com');
 $result = curl_exec($ch);
 curl_close($ch);

if($result == '0'){
 echo "IP résidentielle / non classifiée (c'est-à-dire Safe IP)";
}
else if($result == '1'){
 echo "Détection d'un VPN ou PROXY ou VPS ou Serveur dédié ou hébergeur hosting...";
}
else {
 echo "Connexion inconnue";
}

3) Détecteur N°3 : L'API de http://proxy.mind-media.com/block/

http://proxy.mind-media.com/block/proxycheck.php?ip=xx.xx.xx.xx - La valeur "Y" indique que l'IP est un VPN/ServeurDédié... et la valeur "N" indique que l'IP est fiable de type résidentielle, le "X" indique une erreur. Aucune idée si les requêtes sont limités ou non mais il semblerait que c'est illimité ce qui est bien.
Le site officiel: http://proxy.mind-media.com/block/



$ip = gethostbyname($_SERVER["REMOTE_ADDR"]);
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_URL, 'http://proxy.mind-media.com/block/proxycheck.php?ip='.$ip);
 $result = curl_exec($ch);
 curl_close($ch);

if($result == 'N'){
 echo "IP résidentielle / non classifiée (c'est-à-dire Safe IP)";
}
else if($result == 'Y'){
 echo "Détection d'un VPN ou PROXY ou VPS ou Serveur dédié ou hébergeur hosting...";
}
else {
 echo "Connexion inconnue";
}

 

Codes sources : https://github.com/Mimacy/detection-vpn-en-php

 

 

 

  • Comment faire des frites de qualité comme au kebab ou à la friterie ?
  • 1 commentaire

    #1  - muck-in a dit :

    Bonjour, bloguez-vous sur Wordpress pour votre plateforme de blog?
    Je suis nouveau sur le blog, mais j'essaie de commencer et de créer le mien. Si vous avez besoin d’expertise en codage pour
    réaliser votre propre blog?

    Répondre

    Écrire un commentaire

    Quelle est la dernière lettre du mot kiobz ?