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:
Commenti (18):
1. 0verture
giovedì 10 dicembre 2009 alle 8:51 PM - firefox 3.5.5 Windows 7
   

Quindi adesso non vedremo più commenti fatti sotto l'influsso di oppiacei e mescole di sabbia, acqua vari ?

 

   
2. Paperino
giovedì 10 dicembre 2009 alle 8:54 PM - firefox 3.5.5 Windows 7
   

Non corretto: il codice identifica solo gli utenti TOR, non è mica un cane anti droga.

   
3. floo
giovedì 10 dicembre 2009 alle 9:00 PM - firefox 3.6 Windows 7
   

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

   
4. Gabriele
giovedì 10 dicembre 2009 alle 9:15 PM - firefox 3.5.5 Ubuntu 9.10
   

Già già e IPv6?

   
5. Paperino
giovedì 10 dicembre 2009 alle 9:20 PM - firefox 3.5.5 Windows 7
   

Tor non sembra supportarle

https://www.torproject.org/tordnsel/

   
6. dovella
giovedì 10 dicembre 2009 alle 11:35 PM - IE 8.0 Windows 7
   

Floo Floo Santissimo FLOOO

   
7. floo
giovedì 10 dicembre 2009 alle 11:45 PM - firefox 3.6 Windows 7
   

Che ho fatto?

   
8. il nonno
venerdì 11 dicembre 2009 alle 2:39 PM - IE 8.0 Windows 7
   

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

   
9. EnricoC.
venerdì 11 dicembre 2009 alle 6:50 PM - firefox 3.5.5 Windows 7
   

mi accodo alla domanda del nonno

   
10. Paperino
venerdì 11 dicembre 2009 alle 7:21 PM - firefox 3.5.5 Windows 7
   

@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!

   
11. 0verture
venerdì 11 dicembre 2009 alle 9:40 PM - firefox 3.5.5 Windows 7
   

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

   
12. il nonno
sabato 12 dicembre 2009 alle 6:01 AM - IE 8.0 Windows 7
   

Grazie per avermi tolto il dubbio

   
13. il nonno
sabato 12 dicembre 2009 alle 6:10 AM - IE 8.0 Windows 7
   

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

 

   
14. Paperino
sabato 12 dicembre 2009 alle 7:56 AM - firefox 3.5.5 Windows 7
   

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?

   
15. il nonno
sabato 12 dicembre 2009 alle 8:05 AM - IE 8.0 Windows 7
   

La licenza e' perfetta

   
16. Dovella
sabato 12 dicembre 2009 alle 7:39 PM - firefox 2.0.0.20 Windows 98
   

Italian pls

   
17. 0verture
sabato 12 dicembre 2009 alle 9:54 PM - firefox 3.5.5 Windows 7
   

Italian pls

Hai presente la pubblicità delle pentole ? Ecco è simile: Prendi un macaco e buttalo via

   
18. floo
sabato 12 dicembre 2009 alle 10:15 PM - firefox 3.6 Windows 7
   

Prendi un macaco e buttalo via

Poverino, ha famiglia, non puoi buttarlo via, guarda.

upload.wikimedia.org/.../Rhesus_Macaques.jpg

   
Lascia un commento:
Commento: (clicca su questo link per gli smiley supportati; regole di ingaggio per i commenti)
(opzionale, per il Gravatar)