Il blog di Nicola Amatucci

La mia finestra sul mondo…

Un altro uso per JavaScript

lascia un commento »

Su Hacker Journal n°173 compare un articolo interessante intitolato “La potenza del Browser”, il quale ha particolarmente attirato la mia attenzione. L’idea è di usare JavaScript nel Distributed Computing, ovvero utilizzare un piccolo script che, ciclicamente, richieda al server la sua parte di lavoro, la elabori e invii la risposta al server, il tutto durante la normale navigazione, senza influire sulla QoS percepita dall’utente (il che significa calibrare opportunamente i timeout). Come esempio l’articolo propone il sito http://jsdc.appspot.com/ di cui vado ad analizzare brevemente il codice sorgente.

_d = {
eh: “http://jsdc.appspot.com/Q?”, indirizzo della pagina del server che distribuisce il carico di lavoro e le risposte
iv:150, timeout iniziale (di default)
f:hex_md5, funzione da richiamare
o:9, “cap interval”
z:150, timeout corrente
n:0,

w: function(){  ritorna semplicemente la data
return(new Date()).getTime()
},

u:function() { elabora il pacchetto di lavoro
var x = _d.w(),
e= _d.e +_d.d[_d.n], _d.d sono le parole da convertire in MD5 (passate dal server)
i=0;
if(x-_d.y-_d.z<_d.o) adatta il carico di lavoro al client
_d.z=_d.iv
else
_d.z=x-_d.y;

if(_d.n<_d.d.length)
{
for(;i<_d.d.length;i++) scorro l’array del carico di lavoro
{
if(_d.f(e+_d.d[i])==_d.h) elaboro le singole parole e confronto con l’hash passato dal server
{
_d.v=e+_d.d[i];
_d.b(); inoltro la richiesta con l’apposita funzione b()
return;
}
};
_d.n++;
_d.y=_d.w();
_d.x=setTimeout(_d.u,_d.z) prossimo ciclo
}
else
_d.b() effettuo la richiesta del primo carico di lavoro
},

g:function(u){ funzione che effettua la richiesta
alert(u);
_d.q = document.createElement(“script”) creo un elemento script
_d.q.src=_d.eh + u; imposto come src dell’elemento script la pagina del server che fa il dispatch delle richieste e accumula le risposte
document.body.appendChild(_d.q) aggiungo al body il nuovo tag
},

b:function(){ funzione che compone la richiesta
_d.cs() fermo il timer
_d.g(“e=”+_d.e+”&h=”+_d.h+”&r=”+_d.v+”&”+_d.w()) compongo per la funzione che effettua la richiesta i parametri del GET
},

cs:function(){ ferma il timer e dunque sospende l’elaborazione
clearTimeout(_d.x);_d.x=null;_d.n=0
}

}
setTimeout(_d.g,2000);inizializza l’elaborazione senza parametri (prima richiesta del carico di lavoro)

Cosa manca? Qualche variabile che viene generata dal server e messa nello script relativo al tag “script” generato dinamicamente. Se puntiamo il nostro browser alla pagina “http://jsdc.appspot.com/Q?”, avremo una risposta del genere:

_d.q.parentNode.removeChild(_d.q); eliminiamo il tag script appena creato, in modo da non averne tanti
_d.i=3200;
_d.d=’ole ala apo 123 ddd ff ttt rot oleole’.split(”); il carico di lavoro: le stringhe di cui provare l’hash md5
_d.d.push(”);
_d.h=’b52f753aa106a9df6a51248744fc464f’; l’hash md5 di riferimento
_d.e=’l d’;
_d.y=_d.w()-_d.z; parametri necessari per la temporizzazione
_d.u(); richiamo la funzione dove elabora il pacchetto di lavoro
_d.v=undefined;

Un’ultima osservazione la faccoamo sulla risposta inviata al server dove la variabile “h” del GET contiene il codice hex che si sta esaminando, la variabile “r” l’eventuale risultato (che sta in _d.v).

In sostanza, se tutto il codice non è proprio chiaro, il meccanismo è chiaro e naturale; inoltre non fa uso di AJAX, ma utilizza solo DOM (Domain Object Model). Sperando di avervi aiutato nella comprensione e ispirato qualche bella idea di utilizzo vi lascio l’avvertimento che si può trovare sul sito: questo codice è un proof of concept, instabile e vulnerabile ad attacchi XSS.

Written by Nicola

11 Aprile 2009 a 21:50

Lascia un commento