Detekce sítě Tor
Při kontrole unikátnosti návštěvníka nakonec skončíme u kontroly IP adresy. Problém je, že IP adresa návštěvníka se za určitých okolností může měnit. Týká se to především anonymizační sítě Tor. Tato síť naštěstí nabízí možnost zjistit, zda požadavek přišel z ní.
Poněkud neobvyklý způsob zjištění využívá DNS dotaz na speciální adresu. Pokud tento dotaz vrátí IP adresu z rozsahu 127/8 kromě 127.0.0.1, tak požadavek přišel ze sítě Tor, jinak ne. V PHP kódu se to dá zapsat takto:
<?php /** Obrácení pořadí prvků v IP adrese * @param string * @return string */ function reverse_ip($ip) { return implode(".", array_reverse(explode(".", $ip))); } /** Zjištění, zda je IP adresa součástí sítě Tor * @param string IP adresa vzdáleného počítače * @return bool * @copyright Jakub Vrána, https://php.vrana.cz/ */ function is_tor($ip) { $hostname = reverse_ip($ip) . ".$_SERVER[SERVER_PORT]." . reverse_ip($_SERVER["SERVER_ADDR"]) . ".ip-port.exitlist.torproject.org"; $addr = gethostbyname($hostname); return ($addr != $hostname && $addr != "127.0.0.1" && ip2long($addr) >> 24 == 127); } // použití is_tor($_SERVER["REMOTE_ADDR"]); ?>
Mnohem elegantnější a efektivnější možností (i když těžko dohledatelnou) je použít hromadný seznam Tor adres.
U kontroly hlasování v anketě bych povolil např. jen 1 % požadavků ze sítě Tor každou hodinu (pokud má Tor 200 tisíc uživatelů a Internet 1.67 miliardy, tak uživatelů Toru je asi 0.01 %, takže 1 % poskytuje dostatečnou rezervu).
Diskuse
OK:
Doporučuji spíše ověření IP adresy klienta proti seznamu IP koncových uzlů (viz "tor exit nodes").
Jakub Vrána
:
Asi máš na mysli http://check.torproject.org/cgi-bin/TorBulkExitList.py. To je opravdu mnohem lepší – něco takového jsem původně hledal, ale nenašel.


spaze:
Doplnil bych, že Tor nabízí možnost "tajných" nodů, tedy takových, které nejsou v žádném výše zmíněném seznamu: https://www.torproject.org/docs/bridges takže zda přišel přístup z Toru nelze spolehlivě detekovat.

Martin:
Bridge ale není exit node. Bridge (most) pouze pomáhá přistupovat do sítě TOR.

Ondrej:
Dá sa to spraviť aj takto (niečo je z vašej knihy)
<?php
function isTor(){
// načtení výstupních IP adres sítě Tor
$ips = array();
$file = file(
"http://check.torproject.org/cgi-bin/TorBulkExitList.py?ip="
. $_SERVER["SERVER_ADDR"]
);
foreach ($file as $line) {
if ($line[0] != "#") {
$ips[] = trim($line);
return "1";
}else{
return false;
}
}
}?>
dúfam, že je to správne :)

Diskuse je zrušena z důvodu spamu.

