Formation référencement

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

Articles liés :

Commentaires (26)

Catégorie: Proxies,Scripts PHP


26 Commentaires

Commentaire par admin

Samedi, 29 août , 2009 à 13:56

Merci Lemoussel pour ce partage :) Excellent article ;)

Commentaire par Samuel Montreal

Samedi, 29 août , 2009 à 14:11

merci pour le lien de proxy, je viens de le bookmarker!

Commentaire par Gwaradenn

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

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

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

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

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

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

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

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

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

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

Commentaire par Oliv

Mercredi, 22 septembre , 2010 à 15:19

salut,

probleme avec le script sur une classe pour un paiement ssl, le timeout de 30s de fsockopen a cause avant la possibilite de saisir ses nums et apres les avoir saisi un lag de 30s, pour supprimer ce lag, j’ai passe le timeout de fsockopen a 1 ce qui est bien suffisant dans 99,9% des cas, ce serait bien de mettre « 1″ dans le script de base car beaucoup vont se retrouver avec ce probleme.

sinon sympa la detect ;)

++

Les commentaires sont fermés pour cet article.



SEO BLACKOUT

Site web dédié aux techniques de référencement et de positionnement de sites web sur Google.

Certaines parties du site sont en accès restreint, ces espaces sont réservés à la SEO Black Hat Team.


Don't Be Evil !