JSONP e le richieste cross-domain

26 gennaio 2009

La cosiddetta same-domain-policy è una restrizione presente nei recenti browser che impedisce a script scaricati dalla rete di accedere, tramite qualsiasi tipo di richiesta HTTP, a risorse che si trovano su server diversi rispetto a quello iniziale che ha inviato lo script. Questa inibizione non riguarda solo host diversi tra di loro, ma anche processi in ascolto su porte diverse della stessa macchina.

Questo significa che da un qualsiasi script che faccia uso di AJAX e dell’oggetto XmlHttpRequest non è possibile accedere a qualsiasi tipo di risorsa (HTML, XML, JSON, testo) che si trovi su un server (e in ascolto su una porta) diverso da quello di partenza; uno script scaricato dal dominio google.com potrà accedere solamente a file che rispondano a URL che inizino con google.com.

Quella che può sembrare una forte limitazione nello sviluppo di applicazioni web rappresenta invece un fattore importante per la sicurezza dei nostri computer. Basta infatti pensare a quante  possibilità esisterebbero per far eseguire al nostro browser codice maligno scaricato da chissà quale server semplicemente aprendo un sito che a prima vista può sembrare innoquo.

Il same-domain-policy è stato introdotto molto tempo fa, all’epoca di Netscape Navigator 2.0 ed è stato attualizzato fino ai browser di recente sviluppo come Firefox e Safari. Ovviamente Internet Explorer segue una sua politica che si discosta da quello che ormai è diventanto uno standard de facto. Il browser di casa Microsoft si affida alle cosiddette security zones permettendo infatti all’utente di scaricare script residenti anche su macchine diverse appartenenti alla stessa LAN.

JSONP: una possibile soluzione

JSONP è l’acronimo di JSON with Padding e rappresenta una tecnica che permette di ovviare a questa limitazione permettendo a un browser di accedere, ovviamente con alcuni limiti, a risorse remote indipendentemente dall’host di origine. 

Il meccanismo di funzionamento è semplice ma alquanto particolare. Affrontiamolo con calma.

Uno dei modi per accedere a script on-demand è quello di modificare il DOM della pagina inserendo un nuovo tag <script> all’interno della testata del documento (DOM Lazy Loading – per approfondire si veda questo articolo uscito tempo fa su HTML:it). Questo approccio, nonstante permetta di accedere a file JavaScript remoti, presenta un grosso limite: non si ha infatti  controllo sul codice generato da questa richiesta che verrà eseguoto automaticamente dall’interprete JavaScript appena lo riceverà dal server. Analizziamo un piccolo esempio.

Se all’interno di file JavaScript è presente la definizione di un oggetto libro:

{
	title: “I promessi sposi”,
	author: “Manzoni”
}

esso verrà interpretato automaticamente senza dare la possibilità al programmatore di modificare il flusso normale di esecuzione del codice e quindi di elaborare i dati ricevuti. Le informazioni verranno lette dall’interprete JavaScript ma non verranno in nessun modo fornite al programmatore che non potrà praticamente elaborarle in nessun modo.

Proprio per questa “mancanza di controllo” l’approccio basato sul DOM Lazy Loading non è molto diffuso all’interno di applicazioni web.

JSONP può essere visto come un’estensione a questo approccio che permette di invocare una funzione di callback automatizzata (come spesso viene fatto per le richieste AJAX basate su XmlHttpRequest) al ricevimento di dati. Immaginiamo infatti lo stesso file JavaScript precedente con una leggera modifica:

displayBook({
	title: "I promessi sposi",
	author: "Manzoni"
});

In questo caso grazie all’invocazione automatica appena ricevuto lo script l’interprete eseguirà la funzione displayBook (correttamente definita nel nostro script prima di effettuare la richiesta) avendo a disposizione i nuovi dati scaricati in formato JSON. Immaginiamo infatti di avere nelle nostre pagine la funzione così definita:

function displayBook(book) {
	alert(book.title);
}

Cosi facendo abbiamo utilizzato del tutto dati ricevuti da host differenti da quello di partenza! 

Se vuoi aggiornamenti su JSONP e le richieste cross-domain inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su JSONP e le richieste cross-domain

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy