Comment détecter TOR en PHP ?

Réponses rédigées par Antoine
Dernière mise à jour : 2018-08-27 15:20:41
Thèmes : php - script - tor - webmaster
Question

Comment puis-je détecter un visiteur qui se connecte à mon site depuis TOR ?

Réponse

Pour détecter un visiteur qui se connecterait à votre site via un nœud Tor, il suffit d'utiliser TorDNSEL.

TorDNSEL est un service public fourni par le réseau Tor lui-même. Il s'agit d'une liste DNS des nœuds de sortie du réseau Tor. Cette liste de DNS intègre entre autre une adresse IP et un numéro de port. Contrairement aux DNSxL traditionnels, les services Tor doivent impérativement fournir ces informations dans leurs requêtes.

On peut interroger le service comme suit:

dig 209.137.169.81.6667.4.3.2.1.ip-port.exitlist.torproject.org

Une demande pour l'enregistrement A "209.137.169.81.6667.4.3.2.1.ip-port.exitlist.torproject.org" renverra 127.0.0.2 s'il existe un nœud Tor qui peut sortir par 81.169.137.209 sur le numéro de port 6667 à 1.2. 3.4.

S'il n'y a pas un tel noeud de sortie, le DNSEL renvoie NXDOMAIN.

Les autres enregistrements A dans le réseau 127/8, à l'exception de 127.0.0.1, sont réservés pour une utilisation future et doivent être interprétés par les clients comme indiquant un nœud de sortie.

Les requêtes en dehors de la zone d'autorité DNSEL se traduisent par un refus du réseau. Les requêtes mal formées dans sa zone d'autorité entraînent donc une réponse du type NXDOMAIN.

Un exemple pour un serveur IRC fonctionnant sur le port 6667 à l'adresse IP 1.2.3.4:

6667.4.3.2.1.ip-port.exitlist.torproject.org

Une fois tout ceci compris, il est assez simple de détecter un visiteur utilisant Tor, le script PHP suivant effectue le job.

function IsTorInside(){
if(gethostbyname(ReverseIP($_SERVER['REMOTE_ADDR'])."
.".$_SERVER['SERVER_PORT']."
.".ReverseIP($_SERVER['SERVER_ADDR']).".ip-port.exitlist.torproject.org")=="127.0.0.2"){
return true;
}
else return false;
}

function ReverseIP($ip)
{
$ipx = explode(".",$ip);
return $ipx[3].".".$ipx[2].".".$ipx[1].".".$ipx[0];
}

if (IsTorInside()){
$onion = "ça sent l'onion";
}
else{
$onion = "rien à signaler";
}

echo $onion;