Blog généraliste

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 Aucun commentaire
VPN

Depuis longtemps je recherchais un truc fiable sur 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é 4 bons détecteurs de VPN (ce sont des APIs) :

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

Avantages :

  • Gratuit: 1000 requests par jour.
  • Compatible avec IPv4/IPv6.

Inconvénients :

  • Payant au-delà de 1000 requests/jour.
  • Tarif très cher.

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 ?!

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

Avantages :

  • Gratuit: 500 requests par jour maximum.
  • Compatible IPv4/IPv6

Inconvénients :

  • Limité à 15 requests par minute

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/

Avantages :

  • Requests illimité
  • IPv4

Inconvénients :

  • IPv6 incompatible
  • Le site est fermé depuis fin 2019

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";
}

 

4) Détecteur N°4 : L'API de IPhunter.info

Démo sur le site officiel: https://www.iphunter.info

Avantages :

  • Gratuit: Jusqu'à 1000 requests par jour.
  • Aucune limitation à la minute.
  • Compatible IPv4/IPv6.
  • Prix très correct (jusqu'à 60 000 requests/jour pour 3€99 par mois).
  • PayPal accepté.

Inconvénients :

  • Payant au-delà de 1000 requests/jour

Comment utiliser l'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;
}


$ip = $_SERVER["REMOTE_ADDR"]; //-- IP à consulter
	
// ignore les FAIs
if ( getBooleanFAI($ip) == false ) {


	$apiKey = 'your_api_key'; // Votre clef API (inscription requise)
	
	$headers = [
		'X-Key: '.$apiKey,
	];
	$ch = curl_init("https://www.iphunter.info:8082/v1/ip/".$ip);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	
	$output = json_decode(curl_exec($ch), 1);
	$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	curl_close($ch);
	
	 if($output['data']['block'] == 0){
	 	$block = "IP résidentielle / non classifiée (c'est-à-dire Safe IP)";
	 }
	 else if($output['data']['block'] == 1){
	 	$block = "Détection d'un VPN ou PROXY ou VPS ou Serveur dédié ou hébergeur hosting...";
	 }
	 else if($output['data']['block'] == 2){
	 	$block = "IP non résidentielle et résidentielle (avertissement, peut flagrant des personnes innocentes)";
	 }
	 else {
	 	$block = "Connexion inconnu";
	 }
	 
	 echo $block;


}

Plus d'informations ici : https://www.iphunter.info/docs/jsonkeys

 

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

 

 

 

Écrire un commentaire

Quelle est la dernière lettre du mot cgbp ?