Detekce sítě Tor

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

Dopsal jsem knihu

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, http://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: 2 (nové: 0)

Diskuse

OK:

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

ikona 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.
# 5.10.2009 17:07:51 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, 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:

© 2005-2010 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.