web-dev-qa-db-fra.com

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 arrêter plusieurs comptes et bloquer certains emplacements. Tor est pire que les procurations - un cauchemar total ...

34
domino

Tor est beaucoup plus facile à bloquer que les autres serveurs mandataires ouverts, car la liste des adresses IP de sortie est connue et publiée. Lisez la réponse sur https://www.torproject.org/docs/faq-abuse.html.en#Bans et si vous souhaitez toujours empêcher les utilisateurs d'accéder à votre site, vous pouvez utiliser https: // www.torproject.org/projects/tordnsel.html.fr ou l'outil d'exportation Liste de sorties en bloc. 

Si vous utilisez l'outil d'exportation Liste de sorties en bloc, veillez à obtenir souvent une nouvelle liste et à faire expirer les anciens blocs, car la liste d'adresses IP a été modifiée. 

39
Johan Nilsson

Le blocage de Tor est incorrect car les utilisateurs (ab) et les adresses IP ne sont pas identiques. En bloquant Tor, vous bloquez également les utilisateurs légitimes et les nœuds de sortie Tor limités et inoffensifs configurés avec des stratégies de sortie conservatrices.

Par exemple, si vous êtes préoccupé par les attaques sur SSH (port 22), le blocage de Tor ne fera que très peu pour augmenter la sécurité. Ce dont vous pourriez vraiment avoir besoin, c’est d’une liste noire synchronisée dynamique, telle que http://denyhosts.sourceforge.net/ qui permet de suivre les contrevenants ne tenant aucun compte de leur affiliation avec Tor. 

Denyhosts bloquera automatiquement les nœuds de sortie Tor qui permettent à Tor d'accéder au port 22 sans refuser inutilement l'accès aux utilisateurs anonymes et aux opérateurs des nœuds de sortie Tor qui ne permettent jamais aux contrevenants d'attaquer vos services SSH.

18
Onlyjob
7
Chad Scira

En .NET c'est possible et simple. Je l'ai implémenté sur mon site.

Supposons que votre site possède une adresse IP externe de 192.168.0.5 par souci d'argument. Adresse IP Real TOR au moment de la publication: 95.215.44.97.

Imports System.Net
Imports System.Net.Sockets
Imports System.Web

Private Function IsTorExitNode(sIP As String) As Boolean

    ' Reverse your IP (97.44.215.95) then pass to the string, I have just created it as one for this example
    Try
        Dim strTor As String = "97.44.215.95.80.5.0.168.192.ip-port.exitlist.torproject.org"
        Dim Host As IPHostEntry = Dns.GetHostEntry(strTor)

        If Host.AddressList.Length = 0 Then
            Return False
        Else
            If Host.AddressList(0).ToString() = "127.0.0.2" Then
                Return True
            Else
                Return False
            End If
        End If
    Catch ex As SocketException
        Return False
    End Try
End Function

Panne

Adresse IP inversée: 97.44.215.95
Port: 80
Adresse IP inversée: (adresse IP de votre site externe)

Si l'adresse est un TorExitNode, il retournera 127.0.0.2.

Dans votre fichier Global.asax, vous pouvez utiliser Application_Start pour vérifier si l'adresse IP renvoie la valeur true, puis les rediriger vers votre site:

If IsTorExitNode("97.44.215.95") = True Then Response.Redirect("http://www.google.co.uk")

Désormais, dès qu’ils atteignent votre site, ils sont redirigés.

TOR a une liste de adresses IP , mais évidemment, elles changent tout le temps, alors utiliser ma fonction serait la meilleure solution car il est toujours en temps réel.

6
user3767204

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

3
Alexey Vesnin

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

La demande est la suivante: 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 provient de TOR ou non:

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

2
SochiX
function isTorExitNode() {
    $serverPort = $_SERVER['SERVER_PORT'];
    $remoteAddr = reverseIp(getClientIp());
    $serverAddr = reverseIp($_SERVER['SERVER_ADDR']);
    $placeholders = '%s.%s.%s.ip-port.exitlist.torproject.org';
    $name = sprintf($placeholders, $remoteAddr, $serverPort, $serverAddr);
    return ( gethostbyname($name) === '127.0.0.2' );
}

function getClientIp() {
    if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
    return $_SERVER['REMOTE_ADDR'];
}

function reverseIp($ip) {
    $ipParts = explode('.', $ip);
    return $ipParts[3] . '.' . $ipParts[2] . '.' .
            $ipParts[1] . '.' . $ipParts[0];
}

if(!isTorExitNode()) {
    // Do nothing
} else {
    Die("Sorry, You cannot use TOR network!!!");
}
1
Cem Arslan

Détecter le trafic de Tor est plutôt facile. Pour ce faire, le principal moyen consiste à surveiller la liste de nœuds de sortie Tor et à comparer l'adresse IP à la liste. 

J'ai eu le besoin de faire une telle chose récemment et j'ai construit un petit bijou Ruby pour tenir à jour la liste des noeuds de sortie et fournir un moyen simple de détecter les noeuds de sortie. J'ai aussi écrit un petit exécutable que vous pouvez utiliser pour détecter les noeuds de sortie.

Le bijou est open source et peut être trouvé ici: tor-guard

Installer la gemme est assez simple:

$ gem install tor-guard

Vous pouvez utiliser la bibliothèque dans votre propre code Ruby comme suit:

require 'tor-guard'

if TorGuard.exit_node?('108.56.199.13')
    puts "Yep, it's an exit node!"
end

L'exécutable est également facile à utiliser:

$ tg 108.56.199.13 && echo "Yep, it's an exit node"

1
user427390

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

Cela DEVRAIT inclure les noeuds de sortie, les entrées et les ponts utilisés pour se connecter et naviguer dans Tor.

Utilisez ce script Perl pour collecter les adresses IP à partir 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 ferait cela sans le script Perl, mais après plusieurs heures de recherche, je ne pouvais pas en trouver un.

J'espère que ça aide.

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

1
user2740751

Cela est possible grâce au projet tor qui publie une liste de proxys de sortie.

La liste des serveurs proxy de sortie peut être téléchargée directement du projet à l’adresse https://check.torproject.org/exit-addresses sous forme de texte délimité par des espaces.

J'ai écrit un script python pour ajouter des règles iptables à tous les noeuds de sortie qui rejettent tous leurs paquets. Vous pouvez trouver le script sur github ici: https://github.com/vab/torblock

Si le projet Tor décide de ne plus publier une liste de noeuds de sortie, il sera possible de les bloquer. Le code devrait simplement être écrit pour se connecter au réseau tor et découvrir les noeuds de sortie.

0
V. Alex Brennen

(Ceci a été écrit pour une question spécifique PHP qui a ensuite été supprimée et liée ici sous forme de duplicata).

Clause de non-responsabilité: Pensez à l'effet de bloquer tous les utilisateurs de Tor tel qu'indiqué dans la meilleure réponse ici. N'envisagez que des fonctions de blocage telles que l'enregistrement, le paiement, les commentaires, etc., et non un blocage général de tout.

-

Voici deux solutions pures PHP. Le premier télécharge et met en cache une liste de nœuds Tor et compare l'IP du visiteur à la liste. La seconde utilise le projet Tor DNS Exit List pour déterminer si le visiteur utilise Tor via des recherches DNS.

Méthode n ° 1 (Vérification de l'IP sur une liste de relais Tor):

En utilisant l'ensemble de fonctions suivant, nous pouvons déterminer si une adresse IP appartient au réseau Tor en la comparant à une liste dynamique list téléchargée et mise en cache pendant 10 minutes. N'hésitez pas à utiliser cette liste, mais cachez-vous 10 minutes si possible.

Lorsque vous souhaitez appliquer le contrôle Tor, vous pouvez simplement utiliser:

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

if ($isTorUser) {
    // blocking action
}

Voici le code que vous pouvez mettre dans un fichier de fonctions séparé et inclure lorsque vous souhaitez exécuter la vérification. Notez que vous voudrez peut-être en ajuster une partie pour changer 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://openinternet.io/tor/tor-node-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 n ° 2 (Vérification de l'adresse IP par rapport au projet de liste de sorties DNS DNS de Tor):

La vérification de sortie DNS est un peu plus robuste dans la mesure où elle prend en compte la stratégie de sortie du relais et examine l'adresse IP et le port de votre serveur auxquels le client se connecte. Si ce trafic de sortie est autorisé, il renvoie une correspondance. Le problème potentiel est que, si le projet DNS est temporairement indisponible, les demandes DNS peuvent être suspendues avant que le délai ne ralentisse le processus.

Pour cet exemple, je vais utiliser une classe d'une bibliothèque que j'ai écrite et maintenue et qui s'appelle TorUtils .

Tout d'abord, vous devez l'installer avec Composer à l'aide de composer require dapphp/torutils et inclure le code vendor/autoloader.php standard dans votre application.

Le code de vérification: $ IsTor = false;

try {
    // check for Tor using the remote (client IP), server IP, and server Port (e.g. 80, 443).
    $isTor = TorDNSEL::IpPort(
        $_SERVER['SERVER_ADDR'],
        $_SERVER['SERVER_PORT'],
        $_SERVER['REMOTE_ADDR']
    );
} catch (\Exception $ex) {
    // This would likely be a timeout, or possibly a malformed DNS response
    //echo $ex->getMessage() . "\n";
}

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'adresse IP source) et d'exécuter la vérification initialement ou lorsque l'adresse IP change (par exemple, $_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 une perte de temps à faire pour la même propriété intellectuelle.

0
drew010