Tor exit node lookup in ASP.Net
Potrebbe tornare utile a qualcun altro:
using System.Web;
using System.Net;
namespace TorHelper
{
public class TorHelper
{
const string TOR_EXIT_IP = "127.0.0.2";
private static string ResolveName(string name)
{
string ip = (string) HttpContext.Current.Cache[name];
if (ip == null)
{
ip = ResolveDNS(name);
HttpContext.Current.Cache[name] = ip;
}
return ip;
}
private static string ResolveDNS(string name)
{
try
{
IPHostEntry host = Dns.GetHostEntry(name);
if (host.AddressList.Length == 0)
{
// this should never happen
// but throwing an exception is expensive.
return null;
}
return host.AddressList[0].ToString();
}
catch(SocketException)
{
// this can happen when the DNS doesn't get resolve
// and it actually happens for all IP addresses
// that are not part of the TOR exit list
return String.Empty;
}
}
public static bool IsTorExitNode(string ipAddress)
{
try
{
string torExitEntry = String.Format(
"{0}.{1}.{2}.ip-port.exitlist.torproject.org",
ReverseIPOctet(ipAddress),
"80",
// Domain name is the running
// ASP.Net webSite
ReverseIPOctet(ResolveName(DomainName)) );
if (ResolveName(torExitEntry) == TOR_EXIT_IP)
{
return true;
}
}
catch (Exception e)
{
// log the error
}
return false;
}
private static string ReverseIPOctet(string ipAddress)
{
string[] octets = ipAddress.Split('.');
return String.Format("{3}.{2}.{1}.{0}",
octets[0],
octets[1],
octets[2],
octets[3]);
}
}
}
Su questo blog i commenti lasciati via Tor finiscono in coda di moderazione insieme a quelli che partono da una subnet ban list. Ed ora il giochino si fa più interessante.
-quack
P.S. il pezzo di codice di cui sopra è rilasciato al pubblico dominio con la licenza SQLite:
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
Potrebbero interessarti anche:
- Regex & Lambda
- Overengineering
- Quiz riflessivo per programmatori C#
- Metodi dinamici di delegazione
- Lunedì quiz 4–soluzione


Facebook,
Wikio,
Segnalo.

giovedì 10 dicembre 2009 alle 8:51 PM -
Quindi adesso non vedremo più commenti fatti sotto l'influsso di oppiacei e mescole di sabbia, acqua vari ?
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 8:54 PM -
Non corretto: il codice identifica solo gli utenti TOR, non è mica un cane anti droga.
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 9:00 PM -
Ma funziona anche qualora uno utilizzasse altri proxy tipo Hidemyass e simili? In generale, tutti i proxy che garantiscono l'anonimato? Perché se blocchi solo TOR, morto un Papa ne fanno un altro
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 9:15 PM -
Già già e IPv6?
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 9:20 PM -
Tor non sembra supportarle
https://www.torproject.org/tordnsel/
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 11:35 PM -
Floo Floo Santissimo FLOOO
Permalink - Rispondi al commento
giovedì 10 dicembre 2009 alle 11:45 PM -
Che ho fatto?
Permalink - Rispondi al commento
venerdì 11 dicembre 2009 alle 2:39 PM -
Domandina sul codice.
return null e return String.Empty non ritornano al stessa cosa, quindi in caso di eccezione metti una entry nella cache che non fara' piu' invocare ResolveDNS. Presumo che sia voluto, ma non e' il massimo dell'eleganza
E non mi e' chiaro quali siano i due casi nei quali viene ritornata l'eccezione e quando viene ritornata un'address list a lunghezza zero. Un commento al codice aiuterebbe
Permalink - Rispondi al commento
venerdì 11 dicembre 2009 alle 6:50 PM -
mi accodo alla domanda del nonno
Permalink - Rispondi al commento
venerdì 11 dicembre 2009 alle 7:21 PM -
@il nonno:
il DNS di TOR funziona così: crei un nome artificiale con indirizzo IP "sospetto", porta di destinazione e indirizzo del server di destinazione e interroghi il loro DNS. Se il nome è risolto come 127.0.0.2 il nodo è un nodo di uscita agganciato alla rete di TOR; altrimenti il DNS restituisce un errore di domain not valid che sul lato client diventa una SocketException.
Quindi in caso di eccezione son sicuro che l'IP sospetto è "legittimo" e lo aggiungo alla cache con una stringa vuota in modo tale da non reinterrogare il DNS. Ovviamente un indirizzo IP potrebbe in futuro diventare un nodo di uscita anche se al momento della prima query non lo era, ma è un caso eccezionale che non mi sento di prendere in considerazione, ovvero qualcuno prima commenta e dopo di che aggancia il PC alla rete TOR e quel PC diventa nodo di uscita per un altro commentatore e tutto questo durante un lasso di tempo di qualche ora: quasi impossibile!
Il caso eccezionale dovuto più che altro alla mia pigrizia di leggere la documentazione di GetHostEntry dovrebbe essere una risoluzione che restituisce una lista vuota. In tal caso restituisco NULL e il commento viene considerato comunque safe, ma in questo caso l'entry non va a far parte della cache.
Grazie della code review, ho aggiunto i commenti al codice!
Permalink - Rispondi al commento
venerdì 11 dicembre 2009 alle 9:40 PM -
Chissà se qualcuno si mette a copiare il codice, gira la licenza in gpl e poi viene a fare casino ?
Mi sa che il papero a quel punto mette la maschera nera e parte all'attacco
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 6:01 AM -
Grazie per avermi tolto il dubbio
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 6:10 AM -
Dimenticavo.... come chiave per la cache non sarebbe meglio usare solo l'IP (rovesciato) invece di tutto il torExitEntry?
P.S. Per la serie: adesso Paperino mi manda a quel paese
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 7:56 AM -
L'ho fatto perché ho bisogno di risolvere anche l'indirizzo IP del mio blog in quanto il server su cui gira non popola gli header correttamente. Però ora che mi ci fai pensare potrei memorizzare la risoluzione dell'host in una variabile statica e fare come dici tu.
Aggiudicato! Va bene la mia licenza o vuoi modificarne qualcosa?
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 8:05 AM -
La licenza e' perfetta
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 7:39 PM -
Italian pls
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 9:54 PM -
Hai presente la pubblicità delle pentole ? Ecco è simile: Prendi un macaco e buttalo via
Permalink - Rispondi al commento
sabato 12 dicembre 2009 alle 10:15 PM -
Poverino, ha famiglia, non puoi buttarlo via, guarda.
upload.wikimedia.org/.../Rhesus_Macaques.jpg
Permalink - Rispondi al commento