Mi annoio: anonymizer in rails (anonyrails)

Ciao a tutti, visto che oggi non riesco a scrivere una riga una di
tesi mi stavo cimentando in un programma in rails… ANONYRAILS

Non sono un esperto, quindi vi sottopongo umilmente il mio codice
alla ricerca di spunti per: andare avanti, lasciar perdere o cambiare
progettazione

Il programmino che sto scrivendo e’ un CGI proxy, in pratica l’idea
e’ semplicissima:

  • un controller (Hide) e una regola in config/routes.rb

In config/routes.rb ho piazzato sta regola:

map.connect ‘:myurl’, :controller => ‘hide’, :action =>
‘index’, :requirements => { :myurl => /.*/ }

E in class HideController < ApplicationController ho questa ‘index’
action

def index
url = URI.parse(params[:myurl])
mypage = Net::HTTP.get_response(
url.host, url.path
)
render :text => mypage.body
end

Si lo so e’ molto naif… ora come ora e’ in grado di rispondere
solo a chiamate del tipo:

http://0.0.0.0:3000/http://www.google.it/index.html

Se mai decidessi di andare avanti con sto giochino, mi chiedevo come
gestire gli URL sfruttando il codice gia presente in rails

Io non sono laureato in informatica quindi di solito con il codice
uso la tecnica “picchia il mulo” imparata e veterinaria: la tecnica
consiste nel tirar botte al codice fino a quando non fa (piu o meno)
quello che vorresti … :stuck_out_tongue_winking_eye:

Quindi qual’e’ il modo migliore per:

  1. prendere tutto cio che sta’ in URL dopo il SERVER_NAME + Porta
    (dopo http://0.0.0.0:3000/)

  2. dividere DOMINIO e PATH e PARAMETRI (ora sto usando URI.parse) e
    passarli a Net::HTTP

  3. Rimappare immagini e css (che ora vengono “chiesti” al mio
    applicativo in rails:
    Vedi Questo log (preso dall’output di mongrel)

Processing HideController#index (for 127.0.0.1 at 2008-12-09
16:55:44) [GET]
Parameters: {“myurl”=>“images/nav_logo3.png”}

Non capisco perche' in :myurl (definito in config/routes.rb)

trovo questo link che fa parte del dominio www.google.it… qualcuno
sa spiegarmelo?

  1. Javascript ? possibili soluzioni per rimappare il codice
    javascript dal sito target attraverso il mio server rails?

Perche’ lo faccio:

Il grande goal e’ arrivare a fare proxy chaining attraverso diverse
istanze di anonyrails:

http://anonyrails1/anonyrails2/anonyrails3/http://www.google.it/
index.html

Poi spargero’ i miei server rails in giro per il mondo in computer
compromessi… con un programma dal nome “scapistrano” (TODO!)

Ed alla fine il mondo sara’ mio…

muahahahahahah

vebbeh, scherzo.

Tucano

Io non sono laureato in informatica quindi di solito con il codice
uso la tecnica “picchia il mulo” imparata e veterinaria: la tecnica
consiste nel tirar botte al codice fino a quando non fa (piu o meno)
quello che vorresti … :stuck_out_tongue_winking_eye:

allevare codice a botte, concetto interessante. certe volte ci facciamo
troppe pippe con il design. step 1, farlo funzionare.

Poi spargero’ i miei server rails in giro per il mondo in computer

compromessi… con un programma dal nome “scapistrano” (TODO!)

Ed alla fine il mondo sara’ mio…

muahahahahahah

vebbeh, scherzo.

don’t. conquistare il mondo con capistrano mi sembra una meta piu’ che
nobile :slight_smile:

Se ho ben capito quel che vuoi fare (una catena di proxy http?) credo
che dovrai riscrivere anche gli header http, in particolare l’header
Location ritornato dal server. A questo proposito, c’è già il mod_proxy
di apache che fa praticamente tutto quel che serve, magari in
congiunzione a mod_rewrite.

Non ho nulla da ridire però sul fatto che riscrivere del codice da zero
sia un metodo migliore per imparare un certo dominio applicativo
rispetto a studiare la documentazione di qualcosa che esiste. Infatti
quando voglio imparare davvero qualcosa prima scopro come si fa con il
meglio che trovo in giro (lo state of the art), poi mi metto a fare
qualche esperimento con del mio codice ed infine torno quasi sempre ad
usare quel che hanno già prodotto altri perché inevitabilmente dopo mesi
o anni di sviluppo è meglio di quel che ho fatto io in poche ore o
giorni. Però a quel punto inizio a rendermi conto di come funziona
davvero il sw che andrò ad usare e quali sono i problemi da affrontare e
quindi lo so usare meglio.

Vai quindi avanti a fare l’anonymizer in Rails e chissà che non ne esca
fuori qualcosa di meglio di quel che si potrebbe fare con altre
tecnologie. Un consiglio: per gli esperimenti usa Firefox insieme ad
estensioni come Firebug e LiveHTTPHeaders per tracciare la comunicazione
tra browser e proxy; vedere gli header e tutte le richieste effettuate
ti sarà d’aiuto.

Per la tua domanda numero 3: se il browser fa una richiesta al tuo
server Rails per l’HTML, farà a lui anche tutte quelle per js, immagini,
css ed altro che sono riferiti dall’HTML; e questo mi pare che lo sai e
così vorresti riscrivere tutte le url di quei contenuti per bypassare
Rails. Temo però che sia un compito improbo e probabilmente impossibile
da portare a termine con successo (pensa alle url generate da
javascript). Dovresti mettere davanti a Rails un altro server (Apache?)
a cui far gestire come proxy tutti i mime-type diversi dall’html, ma
questo non renderebbe inutile il proxy Rails?

Paolo

Il giorno 10/dic/08, alle ore 15:14, Paolo M. ha scritto:

Se ho ben capito quel che vuoi fare (una catena di proxy http?) […]

Ti faccio un esempio con del software disponibile:

Prendi http://anonymouse.org, e nel’input text della pagina inserisci
l’indirizzo di un’altro anonymizer … :slight_smile:

tipo http://www.shadowsurf.com/ e ti ritrovi con un URL come questo:

http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.shadowsurf.com/

Ora proviamo a fare chaining ed andare su google… l’URL diventa cosi:

http://anonymouse.org/cgi-bin/anon-www.cgi/http://www2.shadowsurf.com/cgi-bin/nph-shadowsurf.cgi/010110A/x-proxy/start

… un URL orribile no?

A me invece piacerebbe poter fare un proxy chaining “REST” (mi scuso
se sto usando questa definizione in modo errato), tipo:

http://anoynimizer1/http://anonymizer2/http://anonymizer3/http://www.google.it/

sarebbe fighissimo! (ditemi se esiste gia’ qualcosa di simile!)

(Apache?)
a cui far gestire come proxy tutti i mime-type diversi dall’html, ma
questo non renderebbe inutile il proxy Rails?

Sigh sono d’accordo: il compito e’ arduo

Mi son messo a spiare quello che (credo) fanno i CGI-proxy disponibili
in rete
(a parte scavallare le passsword… che lo fanno di sicuro …)

Anonymouse per esempio innietta nella pagina un tag “base”: esempio

<base
href=“http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.yahoo.com/_ylh=X3oDMTFnaGtyajVzBF9TAzI3MTYxNDkEcGlkAzEyMjg5MTg5NTkEdGVzdAMwBHRtcGwDdGFibGUuaHRtbA--/
" target=”_top">
Poi modifica i tag di tutte le immagini, action dei forms, etc…
<img
src="http://anonymouse.org/cgi-bin/anon-www.cgi/http://l.yimg.com/a/i/ww/beta/y3.gif
" width=“232” height=“44” alt=“Yahoo!” title=“Yahoo”>
a anche nel codice javascript… !
Esempio (da google:
Google [Anonymoused])
f.src=“Google [Anonymoused]
#”
Insomma un lavoraccio, dovrei fare la stessa cosa, aggiungendo a tutti
i path che trovo la mia “catena di proxy rails” come prefisso…

Ora passiamo al mio tentativo di smanettone… :slight_smile:
Questo e’ il mio controller: http://pastie.org/335826
per farlo girare, basta aggiungere a config/route.rb:
map.connect ‘:myurl’, :controller => ‘hide’, :action =>
‘index’, :requirements => { :myurl => /.*/ }

In pratica ho aggiunto qualcosa di veramente grezzo che sostituisce
tutti i pattern
/src=“(.*?)”/
aggiungendo “http://0.0.0.0:3000/nomehost”.
con questa schifezza (e’ una prova, siate buoni) sono riuscito a
visualizzare il logo di google (chiamando l’url
http://0.0.0.0:3000/http://www.google.it/index.html)
Domande per i volenterosi che mi vogliono rispondere (vedi codice at
http://pastie.org/335826)

  1. ho inserito il codice che modifica gli url in un metodo private del
    controller, corretto?
  2. il metodo viene chiamato da un “after_filter”, e’ un corretto uso
    dei filtri?
  3. Se usate il controller puntando ad un’immagine, l’immagine viene
    renderizzata come testo! praticamente un more su un file binario via
    web … (esempio:
    http://0.0.0.0:3000/http://www.google.it/intl/it_it/images/logo.gif)
    ; eppure quando rails fa la richiesta riferita alla pagina index.html
    il logo e’ visualizzato correttamente. Non e’ strano?

Qui il log di mongrel:
Processing HideController#index (for 127.0.0.1 at 2008-12-10 17:15:22)
[GET] Parameters: {“myurl”=>“Google”}
Completed in 63ms (View: 0, DB: 0) | 200 OK
[http://0.0.0.0/http://www.google.it/index.html
]
Processing HideController#index (for 127.0.0.1 at 2008-12-10 17:15:22)
[GET] Parameters:
{“myurl”=>"http://www.google.it/intl/it_it/images/logo.gif
"}
Completed in 80ms (View: 0, DB: 0) | 200 OK
[http://0.0.0.0/http://www.google.it/intl/it_it/images/logo.gif
]
Processing HideController#index (for 127.0.0.1 at 2008-12-10 17:15:22)
[GET] Parameters: {“myurl”=>“images/nav_logo3.png”}
Errno::ECONNREFUSED (Connection refused - connect(2)): ← QUESTA IL
MIO super oneline parser non lo becca :wink:

Tucano wrote:

Il giorno 10/dic/08, alle ore 15:14, Paolo M. ha scritto:

Se ho ben capito quel che vuoi fare (una catena di proxy http?) […]

Ti faccio un esempio con del software disponibile:

Prendi http://anonymouse.org, e nel’input text della pagina inserisci
l’indirizzo di un’altro anonymizer … :slight_smile:

tipo http://www.shadowsurf.com/ e ti ritrovi con un URL come questo:

http://anonymouse.org/cgi-bin/anon-www.cgi/http://www.shadowsurf.com/

Ok, non avevo capito quasi niente :slight_smile:
Carino anonymouse, però dalle prove che ho fatto ho visto che ha
problemi con le chiamate ajax, il che non mi meraviglia dato che spesso
e volentieri lì non è questione di url ma si dovrebbe andare a
modificare il codice javascript, una roba da AI.

Ora proviamo a fare chaining ed andare su google… l’URL diventa cosi:

http://anonymouse.org/cgi-bin/anon-www.cgi/http://www2.shadowsurf.com/cgi-bin/nph-shadowsurf.cgi/010110A/x-proxy/start

… un URL orribile no?

A me invece piacerebbe poter fare un proxy chaining “REST” (mi scuso
se sto usando questa definizione in modo errato), tipo:

http://anoynimizer1/http://anonymizer2/http://anonymizer3/http://www.google.it/

sarebbe fighissimo! (ditemi se esiste gia’ qualcosa di simile!)

Concordo, ma come hai già capito non conosco questo genere di servizi.
Provo però a rispondere ad alcune delle tue domande

  1. ho inserito il codice che modifica gli url in un metodo private del
    controller, corretto?

Giusto, meglio mantenere privati i metodi che non si vuole vengano
chiamati dal pubblico.

  1. il metodo viene chiamato da un “after_filter”, e’ un corretto uso
    dei filtri?

Direi di sì, anche se non amo molto i filtri perché tendono a nascondere
all’occhio del codice. Certo che quando fanno risparmiare duplicazioni
infinite di codice sono veramente utili. Nel tuo caso avrei messo tutto
nel metodo index.

  1. Se usate il controller puntando ad un’immagine, l’immagine viene
    renderizzata come testo! praticamente un more su un file binario via
    web … (esempio:
    http://0.0.0.0:3000/http://www.google.it/intl/it_it/images/logo.gif)
    ; eppure quando rails fa la richiesta riferita alla pagina index.html
    il logo e’ visualizzato correttamente. Non e’ strano?

Controlla gli header http: il mime type ritornato da Rails è corretto?
Scommetto di no perché non vedo il codice che copia verso il client gli
header ricevuti dal server.

A presto!
Paolo

From: Tucano [email protected]
To: [email protected]
Sent: Friday, 12 December, 2008 9:42:42
Subject: Re: [ruby-it] Mi annoio: anonymizer in rails (anonyrails)

Torno a gennaio per finire l’anonyrails (beh in realta’ dovro’ finire
prima la testi)

ma una volta le vacanze di tre mesi in cambogia-tailandia-laos non di
facevano dopo aver finito la tesi? :slight_smile:

Caro Paolo sono onorato di avere un po di feedback al mio progetto
“didattico” … :slight_smile:

Lo lascio fermo per un mese perche’ oggi parto.

Anche io quando “volevo diventare un hacker” (vedi aliosha: diario di
un hacker, giorno 23 ), ho telefonato per sbaglio al cambogiano Chea
Vichea: Pare che il suo numero di telefono sia quello usato di default
per la connessione a Internet.

Ora vado a trovarlo: mi ha trovato un lavoro come bracciante nelle
risaie.

Diario di un hacker (per chi non lo conosce);
http://genius.aliosha.org/archivio/2004/06/04/diario-hacker/

… a parte gli scherzi, parto stasera per una traversata di vietnam-
cambogia-thai.

Per la serie siamo tutti tecnocrati: seguite i miei spostamenti (con
foto dei posti piu’ belli) via twitter!

http://twitter.com/tucanourbano

Ciao!!!

Torno a gennaio per finire l’anonyrails (beh in realta’ dovro’ finire
prima la testi)

Il giorno 11/dic/08, alle ore 20:36, Paolo M. ha scritto:

Il giorno 13/dic/08, alle ore 18:32, gabriele renzi ha scritto:

ma una volta le vacanze di tre mesi in cambogia-tailandia-laos non
di facevano dopo aver finito la tesi? :slight_smile:

Infatti ho fatto giusto un mesetto scarso… :stuck_out_tongue:

solo per prepararmi psicologicamente alla scrittura della tesi!

Chea Vichea stava bene… se qualcuno e’ stufo di ruby e
dell’informatica e desidera andare a sminare la cambogia… ho preso
contatti!

Ciao!