Proxy : script PHP détection de Proxy
Ecrit par lemoussel le Samedi 29 août 2009 à 13:47 - Catégorie Proxies,Scripts PHP
Comment détecter le type d’anonymat d’un seveur proxy ?
Il nous arrive de temps en temps de nous retrouver aux prises avec des robots de spam agissant de manière douteuse sur notre site web. Afin d’être anonyme et éviter le blocage au niveau de leur adresse IP, ceux-ci utilisent des serveurs proxies.
Il existe 3 grands type de serveur proxy :
- – Transparent proxy : on sait que la requête HTTP vient d’un proxy et on peut connaitre connaître la véritable adresse du visiteur.
- – Anonymous proxy : on sait que la requête HTTP vient d’un proxy mais on ne peut connaitre la véritable adresse du visiteur.
- – High anonymous (elite) proxy : Impossible de déterminer l’utilisation d’un proxy et impossibilité de connaitre l’adresse IP du visiteur. Le must !
J’ai remarqué que bon nombre d’outils de spam utilisent des proxies « transparent » (les « transparent proxy » sont les plus répandus). Il suffit donc de détecter ce type de proxy afin de récupérer la véritable adresse IP du visiteur (l’adresse IP est adressée dans les requêtes HTTP par l’entête X-Forwarded-For). De la sorte il sera possible d’appliquer une interdiction d’accès au site pour cette adresse IP.
Ci-dessous le code d’un script php permettant de détecter l’utilisation et le type d’un Proxy à copier/coller dans un fichier et à télécharger sur votre serveur ou à utiliser en local :
Code source du script :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | <?php // // Script php : Detection Proxy // By : lemoussel - Aout 2009 // // Copyright http://www.seoblackout.com // @set_time_limit(0); @error_reporting(E_ALL | E_NOTICE); function get_ip() { if($_SERVER) { if($_SERVER['HTTP_X_FORWARDED_FOR']) $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; elseif($_SERVER['HTTP_CLIENT_IP']) $ip = $_SERVER['HTTP_CLIENT_IP']; else $ip = $_SERVER['REMOTE_ADDR']; } else { if(getenv('HTTP_X_FORWARDED_FOR')) $ip = getenv('HTTP_X_FORWARDED_FOR'); elseif(getenv('HTTP_CLIENT_IP')) $ip = getenv('HTTP_CLIENT_IP'); else $ip = getenv('REMOTE_ADDR'); } return $ip; } function detect_proxy($myIP) { $scan_headers = array( 'HTTP_VIA', 'HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED', 'HTTP_CLIENT_IP', 'HTTP_FORWARDED_FOR_IP', 'VIA', 'X_FORWARDED_FOR', 'FORWARDED_FOR', 'X_FORWARDED', 'FORWARDED', 'CLIENT_IP', 'FORWARDED_FOR_IP', 'HTTP_PROXY_CONNECTION' ); $flagProxy = false; $libProxy = 'No'; foreach($scan_headers as $i) if($_SERVER[$i]) $flagProxy = true; if ( in_array($_SERVER['REMOTE_PORT'], array(8080,80,6588,8000,3128,553,554)) || @fsockopen($_SERVER['REMOTE_ADDR'], 80, $errno, $errstr, 30)) $flagProxy = true; // Proxy LookUp if ( $flagProxy == true && isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) ) // Transparent Proxy // REMOTE_ADDR = proxy IP // HTTP_X_FORWARDED_FOR = your IP if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $myIP ) $libProxy = 'Transparent Proxy'; // Simple Anonymous Proxy // REMOTE_ADDR = proxy IP // HTTP_X_FORWARDED_FOR = proxy IP else if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $_SERVER['REMOTE_ADDR'] ) $libProxy = 'Simple Anonymous (Transparent) Proxy'; // Distorting Anonymous Proxy // REMOTE_ADDR = proxy IP // HTTP_X_FORWARDED_FOR = random IP address else if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != $_SERVER['REMOTE_ADDR'] ) $libProxy = 'Distorting Anonymous (Transparent) Proxy'; // Anonymous Proxy // HTTP_X_FORWARDED_FOR = not determined // HTTP_CLIENT_IP = not determined // HTTP_VIA = determined else if ( $_SERVER['HTTP_X_FORWARDED_FOR'] == '' && $_SERVER['HTTP_CLIENT_IP'] == '' && !empty($_SERVER['HTTP_VIA']) ) $libProxy = 'Anonymous Proxy'; // High Anonymous Proxy // REMOTE_ADDR = proxy IP // HTTP_X_FORWARDED_FOR = not determined else $libProxy = 'High Anonymous Proxy'; return $libProxy; } $ip = get_ip(); echo 'Proxy Server Detection<br>'; echo '=================<br><br>'; $typeProxy = detect_proxy($ip); echo 'Use Proxy Server : '.$typeProxy.'<br>'; echo '<br>'; echo 'Brief IP Information'.'<br>'; echo '--------------------'.'<br>'; echo 'Your IP : '.$ip.'<br>'; echo 'Language : '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'<br>'; echo '<br>'; echo 'Detail IP Information'.'<br>'; echo '---------------------'.'<br>'; echo 'HTTP_ACCEPT : '.$_SERVER['HTTP_ACCEPT'].'<br>'; echo 'HTTP_ACCEPT_ENCODING : '.$_SERVER['HTTP_ACCEPT_ENCODING'].'<br>'; echo 'HTTP_ACCEPT_LANGUAGE : '.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'<br>'; echo 'HTTP_ACCEPT_CHARSET : '.$_SERVER['HTTP_ACCEPT_CHARSET'].'<br>'; echo 'HTTP_CONNECTION : '.$_SERVER['HTTP_CONNECTION'].'<br>'; echo 'HTTP_HOST : '.$_SERVER['HTTP_HOST'].'<br>'; echo 'HTTP_KEEP_ALIVE : '.$_SERVER['HTTP_KEEP_ALIVE'].'<br>'; echo 'HTTP_USER_AGENT : '.$_SERVER['HTTP_USER_AGENT'].'<br>'; echo 'REMOTE_HOST : '.@gethostbyaddr($_SERVER['REMOTE_ADDR']).'<br>'; echo 'REMOTE_PORT : '.$_SERVER['REMOTE_PORT'].'<br>'; echo '<br>'; echo 'REMOTE_ADDR : '.$_SERVER['REMOTE_ADDR'].'<br>'; echo 'HTTP_VIA : '.$_SERVER['HTTP_VIA'].'<br>'; echo 'HTTP_X_FORWARDED_FOR : '.$_SERVER['HTTP_X_FORWARDED_FOR'].'<br>'; echo 'HTTP_PROXY_CONNECTION : '.$_SERVER['HTTP_PROXY_CONNECTION'].'<br>'; echo 'HTTP_CLIENT_IP : '.$_SERVER['HTTP_CLIENT_IP'].'<br>'; ?> |
En relation avec l’article Comment trouver des proxies qui fonctionnent ?, j’ai développé un petit outil ProxyFind pour checker et vérifier le type des proxies en appliquant cette détection de proxy.
En résultat, nous obtenons une liste de proxies opérationnels classés par pays d’origine, temps de réponse, type d’anonymat, mode cache et OpenSSL. Dans sa version béta cette liste de proxies opérationnels est actualisée toutes les 6 heures et concerne les proxies utilisant la version du socket HTTP.
En exclusivité sur SeoBlackout, vous pouvez consulter cette liste de proxies opérationnels.
N’hésitez pas à m’indiquer votre avis et vos suggestions d’évolutions concernant cet outil.
Article écrit par Lemoussel
black hattitude
- Attention proxy web, risque duplicate content
- Comment trouver des proxies qui fonctionnent ?
- Script PHP Spam Referer
Commentaires (25)
Catégorie: Proxies,Scripts PHP
- Ajouter cet article à :
- Del.icio.us -
- Digg
Commentaire par admin
Samedi, 29 août , 2009 à 13:56
Merci Lemoussel pour ce partage
Excellent article
Commentaire par Samuel Montreal (2 commentaires)
Samedi, 29 août , 2009 à 14:11
merci pour le lien de proxy, je viens de le bookmarker!
Commentaire par Gwaradenn (16 commentaires)
Samedi, 29 août , 2009 à 14:25
Merci pour ce partage!
La liste va rester ouverte et accessible?
En tout cas, même en High anonymous, une fois banni de propeller, c’est la misère…
Commentaire par maximedt (1 commentaire)
Samedi, 29 août , 2009 à 15:27
Merci pour le script.
Sinon, pour proxyfind, les proxy sont en images ya moyen d’avoir la liste copier collable ? :p
Commentaire par lemoussel (41 commentaires)
Samedi, 29 août , 2009 à 16:33
maximedt, c’est une des petites évolutions a laquelle je pense ….
Du genre un flux RSS pour des personnes inscrites
Commentaire par lemoussel (41 commentaires)
Dimanche, 30 août , 2009 à 6:45
@Gwaradenn, Oui cette liste va rester ouverte et accessible.
Commentaire par tfred84
Lundi, 31 août , 2009 à 10:43
Quelque chose à du m’échapper dans l’utilisation ou le fonctionnement de ce script.
Je l’ai copié collé dans un fichier, téléchargé sur le serveur, mais la page de mon navigateur reste blanche.
Comment faut il utiliser ou installer ce script pour qu’il détecte les adresses ip qui se connectent derrière un proxy à mon site internet.
Doublement merci au créateur de ce blog, c’est une des meilleurs sources que j’ai trouvé et une des seules à parler ouvertement et franchement du référencement.
Commentaire par lemousssel (11 commentaires)
Lundi, 31 août , 2009 à 15:39
tfredd84, comprends pas pourquoi ta page reste blanche. Cela serait t’il provoqué par un blocage avec ton type d’hébergement ?
Sinon pour tester ce script, il te suffit de l’appeler via par exemple un « Web » Proxy (par ex. http://www.totalnetprivacy.com/ mais il en existe bien d’autres) et de voir le résultat.
Commentaire par ranks (15 commentaires)
Lundi, 31 août , 2009 à 18:09
bravo pour ton petit outil Proxyfind, il m’a l’air sympa.
Le problème avec les partages des listes de proxy, c’est qu’elles deviennent rapidement vite inutilisables car tout le monde se rue dessus!
Commentaire par tfred84
Mardi, 1 septembre , 2009 à 8:17
@lemousssel: j’ai posté trop vite.
Comme à chaque fois sur ce site le script est nickel, j’ai refait un copié/collé et il fonctionne à merveille.
Commentaire par Proxy
Mardi, 1 septembre , 2009 à 8:44
C’est normal que je me retrouve avec ces lignes Undefinied lorsque j’appelle le script :
Notice: Undefined index: HTTP_X_FORWARDED_FOR in /htdocs/public/www/proxy.php on line 13
Notice: Undefined index: HTTP_CLIENT_IP in /htdocs/public/www/proxy.php on line 15
Proxy Server Detection
=================
Notice: Undefined index: HTTP_X_FORWARDED_FOR in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_FORWARDED_FOR in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_X_FORWARDED in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_FORWARDED in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_CLIENT_IP in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_FORWARDED_FOR_IP in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: VIA in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: X_FORWARDED_FOR in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: FORWARDED_FOR in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: X_FORWARDED in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: FORWARDED in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: CLIENT_IP in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: FORWARDED_FOR_IP in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_PROXY_CONNECTION in /htdocs/public/www/proxy.php on line 55
Notice: Undefined index: HTTP_X_FORWARDED_FOR in /htdocs/public/www/proxy.php on line 93
Notice: Undefined index: HTTP_CLIENT_IP in /htdocs/public/www/proxy.php on line 94
Use Proxy Server : Anonymous Proxy
Brief IP Information
——————–
Your IP : 217.31.51.77
Language : fr
Detail IP Information
Commentaire par fredgimini
Mardi, 1 septembre , 2009 à 12:18
Moi j’ai la même chose ca vient d’un réglage serveur sur l’affichage des erreurs en effet selon leur configuration certain serveur ne l’affiche pas. Il y a pas mal de doc sur google et les erreurs undefined index et undefined variable
Commentaire par lemoussel (41 commentaires)
Mardi, 1 septembre , 2009 à 16:18
fredgimini, tu as tout a fait raison.
Normalement ce type d’erreur n’est pas reporté par défaut car c’est le type d’erreur le moins important, correspondant à la constante E_NOTICE.
Il existe 2 solutions, pour éviter l’affichage de cette erreur :
1) Ma préférée de solution
Il suffit de tester si ce champs du tableau a été initialisé avec la fonction isset().
Ex : if ( isset($_SERVER[$i]) ) $flagProxy = true;
2) Solution de contournement
modifier les types d’erreurs reportés avec la fonction error_reporting ().
Ex : error_reporting(E_ALL ^ E_NOTICE);
Commentaire par Proxy
Mardi, 1 septembre , 2009 à 19:14
Merci Lemoussel, mais c’est pas trop clair pour ma petite tête.
Par contre connaissez-vous un hébergeur en mutualisé ou ces erreurs n’apparaissent pas.
J’ai une vingtaine d’hébergeur et ai pas trop envie de tous les essayer.
Merci
Commentaire par Proxy
Mercredi, 2 septembre , 2009 à 18:36
Personne !
Car ils sont tous scotché au concours seo
Commentaire par lemousssel (11 commentaires)
Mercredi, 2 septembre , 2009 à 18:55
Proxy,
En effet je me suis lancé dans cette aventure et je peux te dire que j’en bave un max sur ce concours SEO black hattitude
Sinon pour ce script tu remplace la ligne @error_reporting(E_ALL | E_NOTICE);
par
@error_reporting(E_ALL ^ E_NOTICE);
et normalement tu ne devrais plus avoir l’affichage des messages de type NOTICE.
Sinon au niveau hébergement il est vrai qu’il en existe un certain nombre. Pour ma part je travaille avec un hébergeur français qui me satisfait mais je travaille plus particulièrement sur mon PC avec WAMP pour mettre au point les scripts.
Commentaire par globalrecession
Dimanche, 20 septembre , 2009 à 15:31
Très utile le script
Commentaire par BomberSheep
Vendredi, 30 octobre , 2009 à 16:27
Salut,
Je trouve ton code tellement complet que je ne comprends pas tout ^^
Serait il possible qu’on en parle via mail car j’ai plusieurs questions. Cela éviterais de flooder ton blog.
Par contre je ferais un résumé, pour tout débutant selon notre discussion, si tu penses que cela peut en aider d’autres.
Merci par avance à toi.
Commentaire par Jarode
Vendredi, 20 novembre , 2009 à 1:44
Bonjour,
j’ai intégrer ce code dans le fichier function.php d’un forum phpbb3.
Ce que je fait c’est simplement
-copier/coller la fonction get_ip() et detect_proxy($myIP)
-ensuite il y a après $ip = get_ip() suivi de $typeProxy = detect_proxy($ip) pour connaitre le type de proxy utilisé.
-J’utilise alors la variable $typeProxy qui en résulte pour l’écrire quelque part dans le forum.
Mon problème est que cela ralenti le forum à plein pot sauf chez moi et certains chanceux ( ce qui est d’autant plus bizarre ). Les visiteurs m’ont dit que le forum mettait 30 à 45sec pour charger une page contre 2 sec avant. J’ai alors enlevé le code et tout est rentré dans l’ordre.
Une petite aide ou petite explication sur ce qui peut générer ce ralentissment par rapport à ce code serait la bienvenu d’autant plus que j’ai besoin de ce script.
Merci
Commentaire par lemoussel (41 commentaires)
Dimanche, 22 novembre , 2009 à 17:44
Jarode, pour cibler ou cela ralenti je te propose de procéder avec le code PHP suivant :
$time_start = time();
…. Code PHP
$time_end = time();
// Mesure du temps de traitement
$time = $time_end – $time_start;
echo » => Temps de traitement: $time sec. »;
Ainsi tu devrais pouvoir affiner et cibler le pourquoi de ce ralentissement.
Commentaire par jacky75
Jeudi, 31 décembre , 2009 à 18:51
Merci pour vos compétence misent au profit des autres.
Vu les temps qui courent on cherche à rester dans l’anonymat je pense évidemment au p2p.
Mais il y a quelque chose qui m’inquiète un peu.Certes en se donnant un peu la peine on peut trouver sur la toile des proxis anonymes et même le must des élites.Mais, parce que il y a toujours un mais,dans le cas d’un P2P,la liaison se fait toujours,par contre la navigation est pratiquement impossible,qu’importe, c’est un choix à faire,mais que se passe-t-il si le proxy cesse de fonctionner.Il existe un utilitaire en ligne que vous devez connaitre et qui permets de tester les proxis,et chose bizarre le proxy est donné par l’utilitaire comme inactif et laisse passer le P2P,j’ose espérer qu’il n’est pas repris par un proxy du fournisseur d’accés,par exemple,auquel cas bonjours, l’anonymat et tout ce qui suit avec les nouvelles dispositions de nos chers gouvernants.
Le proxy semble être semble être un bon moyen de garder son indépendance encore faut-il qu’il soit utilisé convenablement, mais pour cela il faut bien en connaître les tenants et les aboutissants.
Merci à vous par avance d’une éventuelle réponse.
Jacky
Commentaire par Olivier (1 commentaire)
Samedi, 16 janvier , 2010 à 14:29
Bonjour et merci pour la publication de ce script.
Je viens de le mettre en phase d’essai avant de l’intégrer dans un forum phpBB afin de ne pas autoriser d’inscription lorsque le visiteur passe par un proxy.
Je suis malheureusement contraint d’utiliser ce genre de ressource car un membre récalcitrant ne cesse de s’inscrire (via proxy) pour publier des insultes.
Bref, lors de divers essais le script m’affiche bien la présence de proxy, mais sans avoir pour autant un résultat fiable à 100% Par exemple ce serveur : -http://www.myglype.com me retourne via le script un triste Use Proxy Server : No alors que la plupart de mes essais retournent un Use Proxy Server : High Anonymous Proxy
D’où deux questions :
1) Pourquoi avec ce serveur la présence d’un proxy n’est pas détéctée ?
2) Peut-on accroitre la fiabilité du script pour obtenir un 100%
Merci par avance pour vos réponses.
Merci
Commentaire par VASSI
Mardi, 26 janvier , 2010 à 0:37
Merci beaucoup pour ce script, qui pour ma part ce résume à utiliser :
if ( in_array($_SERVER['REMOTE_PORT'], array(8080,80,6588,8000,3128,553,554))
|| @fsockopen($_SERVER['REMOTE_ADDR'], 80, $errno, $errstr, 30))
$flagProxy = true;
Avec un timeout de 5 secondes au lieu de 30, 30s étant beaucoup trop long pour les utilisateurs réglos (sans proxy) !
Commentaire par Pierrick
Mardi, 30 mars , 2010 à 1:58
J’ai tester le script, et je trouve des proxy qui ne sont pas détecté (mais il en détecte plus que les scripts précédents que je testais).
Par exemple, via ce web proxy :
-http://www.unblocknyc.com/
Il n’est pas détecté. (bon, et faut que je mette les tests de type « isset($var) » )
Commentaire par Bruno
Mardi, 3 août , 2010 à 22:37
Salut, j’ai essayé ce script, il détecte bien le type de serveurs proxy mais ça ne fonctionne pas pour l’ip. L’ip qui est renvoyé avec la fonction $ip = get_ip(); indique l’ip du serveur proxy et non pas l’ip de celui qui est derrière le proxy. Je me suis connecté à la page de mon script de détection de proxy avec ce site http://freeproxyserver.net















