Browser e ap­pli­ca­zio­ni web di­spon­go­no di numerose funzioni e metodi per pro­teg­ge­re gli utenti e i loro dati dagli attacchi in­for­ma­ti­ci. Uno di questi è la co­sid­det­ta same origin policy (it. regola della stessa origine), in breve SOP, che l’ex browser Netscape ha in­tro­dot­to nel 1996 con l’im­ple­men­ta­zio­ne di Ja­va­Script. Questa direttiva impedisce ai linguaggi di scripting lato client, come Ja­va­Script e Ac­tion­Script, ma anche ai linguaggi per i fogli di stile come CSS, di accedere ad oggetti (grafici, video ecc.) pro­ve­nien­ti da un altro sito web o URL.

N.B.

Il termine “origine” è definito come una com­bi­na­zio­ne di pro­to­col­lo (per esempio HTTP o HTTPS), dominio e porta nell’URL. Solo se tutti e tre gli elementi sono identici la SOP è con­si­de­ra­ta sod­di­sfat­ta, ed è quindi possibile l’accesso agli script tra siti. Co­sti­tui­sco­no un’eccezione a ciò i sot­to­do­mi­ni che possono accedere agli oggetti di domini di livello superiore tramite le proprietà DOM ap­pro­pria­te.

Tuttavia i limiti stabiliti dalla same origin policy non sono van­tag­gio­si per ogni tipo di progetto web e in alcuni casi sono ad­di­rit­tu­ra di intralcio, come nelle ap­pli­ca­zio­ni web che si basano sul tra­sfe­ri­men­to di dati asincrono tra browser e server (ad esempio su base Ajax). Tali progetti ri­chie­do­no soluzioni per aggirare la direttiva come il metodo JSON JSONP, che verrà spiegato in modo più det­ta­glia­to nelle sezioni seguenti.

Che cos’è JSONP?

JSONP (scritto anche JSON-P) è un metodo mediante il quale è possibile inviare dati strut­tu­ra­ti in formato JSON tra domini diversi. L’acronimo sta per JSON (JavaScript Object Notation) with Padding (it. JSON con “ri­ve­sti­men­to“). Per bypassare la same origin policy quando si ri­chie­do­no file da altri domini, JSONP non utilizza l’oggetto “XM­LHtt­pRe­que­st“, come abituale codice JSON, ma l’elemento “script” inclusa una chiamata di funzione. A dif­fe­ren­za di altri file gli script possono anche essere tra­sfe­ri­ti tra domini senza violare la SOP.

JSONP è stato concepito nel 2005 dallo svi­lup­pa­to­re di software Bob Ippolito e nel corso degli ultimi anni è stato integrato in molti framework Web 2.0 come Dojo Toolkit, jQuery o Google Web Toolkit come valida al­ter­na­ti­va al normale JSON.

N.B.

JSONP è solo uno dei tanti metodi per abilitare i tra­sfe­ri­men­ti di dati tra domini. La Cross-Origin Resource Sharing (CORS) presenta un mec­ca­ni­smo simile che non è su­bor­di­na­to a JSON ma che al contrario funziona con speciali in­te­sta­zio­ni HTTP.

Come funziona JSONP?

JSONP risolve la pro­ble­ma­ti­ca relativa alla same origin policy grazie all’elemento <script>. Nell’attributo “src“ di questo elemento è possibile spe­ci­fi­ca­re qualsiasi dominio, inoltre la direttiva qui non è ap­pli­ca­bi­le. Pertanto, l’attributo può essere uti­liz­za­to anche per di­stin­gue­re gli URL che ap­par­ten­go­no a un dominio esterno e per re­sti­tui­re il codice JSON e altri file. In tal caso, lo script stesso funge esclu­si­va­men­te da fornitore di servizi, che trasmette la query JSONP al ri­spet­ti­vo server senza con­se­guen­ze. Affinché il client sia in grado di elaborare i dati in un secondo momento, il server a sua volta li con­fe­zio­na come parametri in una funzione Ja­va­Script che è già pre­de­fi­ni­ta nel browser web e che viene co­mu­ni­ca­ta al server nella stringa di query (o parte della query) dell’URL.

N.B.

Il formato e il nome dei parametri, da spe­ci­fi­ca­re nella stringa di query per avviare una query JSONP, non sono stan­dar­diz­za­ti. Po­treb­be­ro pertanto differire da un’ap­pli­ca­zio­ne web all’altra.

L’esempio seguente dovrebbe chiarire la fun­zio­na­li­tà di JSONP:

<script type="text/javascript" < codesnippet></script>
src="http://not-origin-url.com/getjson?jsonp=exampleCallback">

Se questo semplice script JSONP viene in­cor­po­ra­to nel codice HTML di un sito web e poi eseguito da un client qualsiasi, i dati JSON vengono re­cu­pe­ra­ti (“getjson“) dal dominio esternonot-origin-url.com“. La stringa di query?jsonp=exam­ple­Call­back“ rivela al server con­tat­ta­to che si tratta di una query JSONP. Viene inoltre fornita l’in­for­ma­zio­ne che il server dovrebbe inviare i dati richiesti come parametro della funzione Ja­va­Scriptexam­ple­Call­back“.

Il server genera quindi il codice Ja­va­Script ap­pro­pria­to, in­clu­den­do le in­for­ma­zio­ni richieste come parametro, nel caso di questo esempio una coppia nome-valore, e lo re­sti­tui­sce al client:

exampleCallback( {"name":"test", "value":1} );

La chiamata di funzione viene quindi eseguita dal browser, come se fosse re­gi­stra­to di­ret­ta­men­te nel codice HTML del sito ori­gi­na­rio. Il browser è pertanto in grado di elaborare i dati re­cu­pe­ra­ti dall’URL esterno.

N.B.

Ogni query JSONP richiede un singolo elemento <script>. In al­ter­na­ti­va è possibile ag­giun­ge­re un nuovo elemento al lato client (definito iniezione dell’elemento script) oppure riu­ti­liz­za­re un elemento già esistente.

Per una di­mo­stra­zio­ne più completa del metodo JSONP, con­sul­ta­re il seguente tutorial di YouTube:

Quanto è sicuro JSONP?

JSONP è altamente con­tro­ver­so negli ambienti pro­fes­sio­na­li come soluzione per aggirare la SOP, in par­ti­co­la­re a causa del maggiore rischio di sicurezza associato alle query di script. Questo fatto da solo ga­ran­ti­sce che un com­po­nen­te ag­giun­ti­vo venga integrato nei processi del sito web di origine, il cui sistema di sicurezza non può essere in­fluen­za­to. Se il server con­tat­ta­to presenta vul­ne­ra­bi­li­tà che con­sen­to­no iniezioni Ja­va­Script in­de­si­de­ra­te (in­clu­sio­ne del codice Ja­va­Script) da parte di utenti ma­lin­ten­zio­na­ti, il server di origine viene au­to­ma­ti­ca­men­te esposto a una minaccia immediata, in par­ti­co­la­re perché si potrà accedere non solo ai documenti JSON (come nell’esempio), ma a qualsiasi tipo di dati.

Altri schemi di attacco noti che sfruttano il metodo JSONP sono i seguenti:

  • RFD (Reflected File Download): JSONP è vul­ne­ra­bi­le ai co­sid­det­ti attacchi RFD, in cui gli utenti client solo ap­pa­ren­te­men­te scaricano i dati dal dominio di de­sti­na­zio­ne de­si­de­ra­to. In realtà vengono tuttavia caricati file o URL dannosi, il che nella maggior parte dei casi è dovuto a una ma­ni­po­la­zio­ne delle funzioni di callback.
  • CSRF/XSRF (Cross-Site-Request-Forgery) poiché l’elemento <script> ignora la same origin policy, un sito web dannoso può ri­chie­de­re, ottenere e valutare dati da altre ap­pli­ca­zio­ni web. Se l’utente è connesso al sito attaccato, gli ag­gres­so­ri con queste richieste false tra domini po­treb­be­ro accedere a dati sensibili come le in­for­ma­zio­ni di accesso. 

    Chiunque voglia uti­liz­za­re gli script JSONP nel proprio progetto web, dovrebbe essere as­so­lu­ta­men­te sicuro che non solo il proprio server ma anche quello dell’ap­pli­ca­zio­ne web con­tat­ta­ta sia protetto da tali attacchi e da qualsiasi tipo di malware. Il codice JSONP, che recupera i dati da fonti non sicure, non andrebbe di con­se­guen­za uti­liz­za­to.

Vai al menu prin­ci­pa­le