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 Google pour détecter l'IP d'un visiteur en PHP afin de savoir s'il utilise une ip de résidence, 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é 6 bons détecteurs de VPN (ce sont des APIs) :

Sommaire

  1. API IPHub
  2. API GetIPintel
  3. API Blackbox
  4. API IPHunter
  5. IP-API
  6. API Proxycheck.IO

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 the French Internet Providers
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

 

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 https://blackbox.ipinfo.app

Avantages :

  • Requests illimité
  • IPv4
  • IPv6

Inconvénients :

  • ...

https://blackbox.ipinfo.app/lookup/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: https://blackbox.ipinfo.app


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 the French Internet Providers
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, 'https://blackbox.ipinfo.app/lookup/'.$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 pendant 15 jours.
  • 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

5) Détecteur N°5 : l'API de ip-api.com

Site web: https://ip-api.com et https://members.ip-api.com

Avantages :

  • Gratuit: Jusqu'à 45 requests par minute.
  • Compatible IPv4/IPv6.
  • Prix d'environ 13€ par mois (pour du requests illimités).
  • PayPal accepté.

Inconvénients :

  • ...

6) Détecteur N°6 : l'API de proxycheck.io

Site web: https://proxycheck.io

Avantages :

  • Gratuit: Jusqu'à 1000 requests par jour.
  • Compatible IPv4/IPv6.
  • Prix d'environ 4$ par mois (jusqu'à 20 000 requests par jour).
  • PayPal accepté sur demande.

Inconvénients :

  • ...

 

Codes sources : https://github.com/Mimacy/Detection-VPN

 

 

 

1 commentaire

#1  - Bryce a dit :

Merci pour ces informations.
Il manque toutefois une évaluation de la fiabilité pour chaque ; ça aiderai vraiment pour choisir.
Cordialement

Répondre

Écrire un commentaire

Quelle est le dernier caractère du mot 8usrh ?