web-dev-qa-db-fra.com

Détecter les clients avec les serveurs proxy via PHP

Je recherche une méthode ou un moyen de détecter les clients à l'aide de n'importe quel type de serveur proxy visualisant mon site Web. J'utilise PHP/Apache ... quelle est la meilleure façon de faire cela? Tout serveur proxy doit être détecté, pas spécifiquement l'un ou l'autre.

Modifier

Je suis plus intéressé par les proxies anonymes ... car ceux qui sont normaux sont facilement détectés en recherchant HTTP_X_FORWARDED_FOR.

Une autre édition

Essaye ça: 

1) allez sur http://kproxy.com (ou sur tout autre site proxy anonyme gratuit)

2) visitez: http://www.worldofwarcraft.com

3) ils sont capables de bloquer d’une manière ou d’une autre, car la page contient "Erreur lors du chargement de la feuille de style: une erreur réseau s'est produite lors du chargement d’une feuille de style XSLT: http://kproxy.com/new-hp/layout/layout.xsl "

Je veux faire quelque chose de similaire pour empêcher les mandataires.

23
MichaelICE

Vous ne pouvez le détecter que s’ils transmettent des en-têtes spéciaux qui le mentionnent explicitement, comme X-Forwarded-For ou quelque chose du genre. 

Autant que je sache, vous devez utiliser une liste noire. Les utilisateurs qui utilisent PuTTY portforwarding, VPN ou d’autres méthodes plus sophistiquées ne sont pas activés car ils se comportent exactement comme des utilisateurs normaux.

17
TomHastjarjanto

Utilisez les 2 solutions suivantes en PHP. // method 1 = quick mais ne fonctionne pas avec les mandataires anonymes

    $proxy_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'
    );
    foreach($proxy_headers as $x){
        if (isset($_SERVER[$x])) die("You are using a proxy!");
    }

// Méthode 2 = revenez à l'adresse IP d'origine par les ports de proxy normaux utilisés.

    $ports = array(8080,80,81,1080,6588,8000,3128,553,554,4480);
    foreach($ports as $port) {
         if (@fsockopen($_SERVER['REMOTE_ADDR'], $port, $errno, $errstr, 30)) {
              die("You are using a proxy!");
         }
     }
24
X-Ray

Metasploit utilise de nombreuses techniques différentes pour forcer le système du client à établir une connexion directe (vulnérabilités/problèmes de fonctionnement dans Flash, Java, QuickTime, MS Office, serveur DNS personnalisé).

Sinon, si vous ne parvenez pas à lancer métasploit dans le navigateur du client, vous pouvez essayer de rechercher des proxies ouverts (analyse des ports) et des nœuds de sortie Tor connus .

Mais s'il vous plaît, ne supposez pas que les proxys sont diaboliques et doivent être bloqués - il y a beaucoup de proxys légitimes et certains utilisateurs doivent les utiliser.

Si vous rencontrez des problèmes avec le spam ou tout autre trafic abusif, le simple fait de bloquer des mandataires n'aidera pas grand-chose. Vous devez rechercher des solutions spécifiques qui traitent le cœur du problème (filtres anti-spam, IDS) plutôt que de supposer que le terme anonyme = coupable.

8
Kornel

Il existe différentes solutions payantes/gratuites. La plupart d'entre eux examinent l'adresse IP du client qui tente de se connecter pour déterminer s'ils utilisent un proxy ou non.

Payé: 
Maxmind - Ils se concentrent sur la détection de la fraude et ont une sous-catégorie pour la détection de proxy. Notez que ceci est maintenant considéré comme un service "hérité".

Libre:
W I T C H - Capable de détecter OpenVPN en examinant les valeurs du SMS qui sont uniquement identifiables. Le code est disponible sur github.

GetIpIntel - Détection de proxy/VPN utilisant l'apprentissage automatique, requêtes via une API.

Quelques autres options gratuites sont répertoriées sur l’échange de piles de sécurité .

3
S W

Ce site web affiche cette erreur car son code source est doté d'une adresse pointant vers "new-hp/layout/layout.xsl". Un proxy veut cacher votre adresse IP, il doit donc la remplacer par http://kproxy.com/new-hp/layout/layout.xsl , pour pointer vers leur serveur, mais le fichier n’existe pas vraiment, donc Flash Plugin ne peut pas le trouver.

1
Ciobanu Robert

Tout ce que le client transmet au serveur peut être auto-configuré. Vous ne pouvez faire confiance à rien, sauf pour une adresse IP. Donc, vous ne pouvez pas vérifier les données d'en-tête, s'il s'agit d'un proxy ou d'un client normal.
Au fait: L’intention d’un mandataire est de ne pas montrer qu’il est un proxy :)

Bien sûr, vous pouvez prendre l'adresse IP du demandeur et envoyer une requête http que vous enverriez à un proxy. S'il réagit, il peut s'agir d'un proxy sinon, il s'agit d'un client normal. Cette méthode serait très coûteuse et non fiable. Si le proxy demandé par votre serveur était derrière un pare-feu, vous n'obtenez pas de réponse et croyez qu'il s'agit d'un client normal.

1
guerda

Je pense que ce qui se passe ici, c'est que du code JavaScript côté client tente de charger quelque chose, et que cela "voit" que la page est affichée dans un cadre. Cela pourrait être une avenue plus fructueuse à explorer - comme d'autres réponses l'ont indiqué, les mandataires empêchent délibérément de déterminer uniquement à partir du serveur.

1
araqnid

Vieux sujet, mais j'aurais peut-être trouvé quelque chose.

Il est en direct sur mon site et je pense que cela pourrait fonctionner dans la plupart des cas.

Mon problème était que les utilisateurs interdits revenaient sur mon site et se ré-enregistraient avec une nouvelle adresse e-mail en utilisant l'un des nombreux serveurs proxy que vous pouvez trouver. Ce que j’ai fait est un simple appel jQuery sur le formulaire d’inscription/connexion:

<form id="login_form" method="post" action="/#fake_login_url">
   stuff you need for the form
</form>
<script>
   $('#login_form').attr('action','real_login_form');
</script>
1
Fabrizio

Même si c'est une vieille question, j'ai dû chercher un proxy et malheureusement aucune des réponses ne donne un bon résultat.

Après avoir cherché, j'ai trouvé une meilleure méthode. Afin de comprendre cette façon de faire, créez simplement une petite page avec ce code:

 <?php
 foreach ($_SERVER as $key => $val)
 {
     echo $key."<br>\n";  
 }
 ?>

Lancez-le directement depuis votre serveur. Vous verrez toutes les clés de l'en-tête que votre serveur envoie. Ensuite, exécutez le même script via un proxy. Vous verrez (selon le proxy) 3 résultats possibles:

  1. le proxy ajouter des nouvelles clés/valeurs
  2. le mandataire n'envoie pas toutes les clés/valeurs d'origine, certaines sont donc manquantes.
  3. le mandataire envoie exactement les mêmes clés/valeurs mais pas dans le même ordre
  4. le mandataire envoie exactement les mêmes clés/valeurs, dans le même ordre

Le quatrième cas peut arriver, mais les autres sont les plus fréquents. Il vous suffit donc de créer un tableau avec la clé/valeur de votre serveur (en fonction du résultat obtenu lorsque vous exécutez le script sans proxy) et de comparer le clés/valeurs à partir de $ _SERVER. Si vous n'avez pas exactement les mêmes clés/valeurs (moins, plus ou dans un autre ordre), vous pouvez supposer que la page provient d'un proxy.

Notez que je suis d’accord avec ceux qui disent que dans certains cas, le proxy peut être utilisé de manière "légale".

0
Peter