Detekce sítě Tor

Školení, která pořádám

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).

Jakub Vrána, Řešení problému, 5.10.2009, diskuse: 5 (nové: 0)

Diskuse

OK:

Doporučuji spíše ověření IP adresy klienta proti seznamu IP koncových uzlů (viz "tor exit nodes").

ikona Jakub Vrána OpenID:

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.

ikona 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.

ikona Martin:

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

ikona 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 :)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.