42 votes

Est-il possible de bloquer les utilisateurs de Tor ?

Serait-il possible de bloquer les utilisateurs de Tor ? ( https://www.torproject.org/ )

En raison de la nature du site que je gère, je dois faire tout ce qui est en mon pouvoir pour empêcher les comptes multiples et bloquer certains emplacements. Tor est pire que les proxies - un cauchemar total...

2voto

Alexey Vesnin Points 49

C'est un fait, la meilleure défense d'une application est son code et sa sécurité, pas une liste de blocage de pare-feu. S'il est essentiel pour vous d'avoir de vrais utilisateurs, vous devez utiliser les outils suivants authentification à deux facteurs . Les listes de blocage sont totalement inutiles de nos jours.

2voto

drew010 Points 32825

(Ceci a été écrit pour une question spécifique à PHP qui a été par la suite supprimée et liée ici comme un duplicata).

Disclaimer : Considérez l'impact du blocage de tous les utilisateurs de Tor comme indiqué dans la meilleure réponse ici. Envisagez de ne bloquer que les fonctions telles que l'enregistrement, le paiement, les commentaires, etc. et non un blocage général de tout.

--

Voici deux solutions purement PHP. La première télécharge et met en cache une liste de nœuds Tor et compare l'IP du visiteur avec cette liste. La seconde utilise la méthode Liste des sorties DNS de Tor pour déterminer si le visiteur utilise Tor via des vérifications DNS.

Méthode #1 (Vérifier l'IP par rapport à une liste de relais Tor) :

En utilisant l'ensemble des fonctions suivantes, nous pouvons déterminer si une IP appartient au réseau Tor en la comparant à une base de données dynamique. liste de sortie qui est téléchargé et mis en cache pendant 10 minutes. N'hésitez pas à utiliser cette liste mais, dans la mesure du possible, mettez-les en cache pendant 10 minutes.

Lorsque vous voulez appliquer la vérification de Tor, vous pouvez simplement utiliser :

$isTorUser = isTorUser($_SERVER['REMOTE_ADDR']);

if ($isTorUser) {
    // blocking action
}

Voici le code que vous pouvez placer dans un fichier de fonctions séparé et inclure lorsque vous voulez exécuter la vérification. Notez que vous pouvez en ajuster une partie pour modifier le chemin d'accès au fichier de cache.

<?php

function isTorUser($ip)
{
    $list = getTorExitList();

    if (arrayBinarySearch($ip, $list) !== false) {
        return true;
    } else {
        return false;
    }
}

function getTorExitList()
{
    $path = __DIR__ . '/tor-list.cache';

    if ( file_exists($path) && time() - filemtime($path) < 600 ) {
        $list = include $path;
        if ($list && is_array($list)) {
            return $list;
        }
    }

    $data = file('https://www2.openinternet.io/tor/tor-exit-list.txt');
    if (!$data) {
        return array();
    }

    $list = array();

    foreach($data as $line) {
        $line = trim($line);
        if ($line == '' || $line[0] == '#') continue;

        list($nick, $ip) = explode("\t", $line);
        $list[] = $ip;
    }

    sort($list);

    file_put_contents($path, sprintf("<?php return %s;", var_export($list, true)));

    return $list;
}

/**
 * Perform binary search of a sorted array.
 * Credit: http://php.net/manual/en/function.array-search.php#39115
 *
 * Tested by VigilanTor for accuracy and efficiency
 *
 * @param string $needle String to search for
 * @param array $haystack Array to search within
 * @return boolean|number false if not found, or index if found
 */
function arrayBinarySearch($needle, $haystack)
{
    $high = count($haystack);
    $low = 0;

    while ($high - $low > 1){
        $probe = ($high + $low) / 2;
        if ($haystack[$probe] < $needle){
            $low = $probe;
        } else{
            $high = $probe;
        }
    }

    if ($high == count($haystack) || $haystack[$high] != $needle) {
        return false;
    } else {
        return $high;
    }
}

Méthode #2 (Vérifier l'IP par rapport au projet de liste de sortie DNS de Tor) :

La vérification de la sortie DNS est un peu plus robuste dans la mesure où elle prend en compte la politique de sortie du relais et regarde à quelle IP et à quel port de votre serveur le client se connecte et si ce trafic de sortie est autorisé, elle renvoie une correspondance. Si le trafic de sortie est autorisé, il renvoie une correspondance. L'inconvénient potentiel est que si le projet DNS est temporairement en panne, les requêtes DNS peuvent être suspendues avant de se terminer, ce qui ralentit les choses.

Pour cet exemple, je vais utiliser une classe d'une bibliothèque que j'ai écrite et que je maintiens appelée TorUtils .

Tout d'abord, vous devrez l'installer avec Composer en utilisant composer require dapphp/torutils et inclure la norme vendor/autoloader.php dans votre application.

Le code pour le contrôle : $isTor = false ;

try {
    // check for Tor using the remote (client IP)
    if (TorDNSEL::isTor($_SERVER['REMOTE_ADDR'])) {
        // do something special for Tor users
    } else {
        // not using Tor, educate them! :-D
    }
 } catch (\Exception $ex) {
     // This would likely be a timeout, or possibly a malformed DNS response
     error_log("Tor DNSEL query failed: " . $ex->getMessage());
 }

if ($isTor) {
    // blocking action
}

Considérations supplémentaires

Si votre application utilise des sessions PHP, je vous suggère fortement de mettre en cache la réponse "isTorUser" dans la session (avec l'IP source) et de n'exécuter la vérification qu'au début ou lorsque l'IP change (par ex. $_SERVER['REMOTE_ADDR'] != $_SESSION['last_remote_addr'] ) afin de ne pas effectuer de nombreuses recherches en double. Même s'ils essaient d'être très efficaces, c'est un gaspillage de faire plusieurs recherches pour la même IP.

2voto

Ilia P Points 478

Ici (voir https://github.com/RD17/DeTor ) est une simple API REST permettant de déterminer si une requête a été faite depuis le réseau TOR ou non.

La demande est : curl -X GET http://detor.ambar.cloud/ .

La réponse est :

{ 
  "sourceIp": "104.200.20.46",
  "destIp": "89.207.89.82",
  "destPort": "8080",
  "found": true 
}

En prime, vous pouvez ajouter un badge à votre site pour détecter si un utilisateur vient de TOR ou non :

<img src="http://detor.ambar.cloud/badge" />

2voto

martinszy Points 113

Depuis que TorDNSEL a été déprécié et remplacé par un nouveau système en avril 2020 [1], la plupart des réponses dans ce fil sont dépassées.

Après un peu d'efforts, j'ai trouvé ce code qui utilise le nouveau vérificateur. Il inverse les octets de l'adresse IP et crée une URL pour le nouveau vérificateur, puis effectue une requête DNS et vérifie si la première réponse a l'adresse IP "127.0.0.2" ou non. Si c'est le cas, l'utilisateur est considéré comme venant de Tor, sinon il renvoie faux.

function IsTorExitPoint(){
    $dns_record = dns_get_record(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".dnsel.torproject.org.");

    if ($dns_record && $dns_record[0] && $dns_record[0]["ip"] == "127.0.0.2") {
        return true;
    } else {
        return false;
    }
}
function ReverseIPOctets($inputip){
    $ipoc = explode(".",$inputip);
    return $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
}

[1] https://lists.torproject.org/pipermail/tor-project/2020-March/002759.html

PD : Cela fait un moment que je n'ai pas posté de réponse à stackoverflow, alors s'il vous plaît soyez indulgent avec moi et aidez-moi à m'améliorer si possible.

1voto

user2740751 Points 27

J'ai trouvé une liste de tous les nœuds Tor mise à jour toutes les demi-heures : https://www.dan.me.uk/tornodes

Cela devrait inclure les nœuds de sortie, d'entrée et de pont utilisés pour se connecter et naviguer à travers Tor.

Utilisez ce script Perl pour rassembler les adresses IP d'une page web téléchargée :

perl -lne 'print $& if /(\d+\.){3}\d+/' downloadedwebpage.html > listofips.out

Il vous donnera une liste d'adresses IP, une par ligne. J'ai essayé de trouver quelque chose qui fasse cela sans le script Perl, mais après de nombreuses heures de recherche, je n'en ai pas trouvé.

J'espère que cela vous aidera.

J'ai également trouvé de bonnes informations sur le même site : https://www.dan.me.uk/dnsbl

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X