Ricerca…


introduzione

La politica Same-Origin viene utilizzata dai browser Web per impedire agli script di accedere al contenuto remoto se l'indirizzo remoto non ha la stessa origine dello script. Ciò impedisce agli script dannosi di eseguire richieste ad altri siti Web per ottenere dati sensibili.

L' origine di due indirizzi è considerata la stessa se entrambi gli URL hanno lo stesso protocollo , nome host e porta .

Modi per eludere la politica della stessa origine

Per quanto riguarda i motori JavaScript lato client (quelli in esecuzione all'interno di un browser), non esiste una soluzione immediata per la richiesta di contenuti da fonti diverse dal dominio corrente. (A proposito, questa limitazione non esiste negli strumenti JavaScript-server come Node JS.)

Tuttavia, è (in alcune situazioni) effettivamente possibile recuperare i dati da altre fonti usando i seguenti metodi. Si prega di notare che alcuni di essi potrebbero presentare hack o soluzioni alternative invece di soluzioni su cui il sistema di produzione dovrebbe fare affidamento.

Metodo 1: CORS

La maggior parte delle API pubbliche oggi consente agli sviluppatori di inviare dati bidirezionalmente tra client e server abilitando una funzionalità chiamata CORS (Cross-Origin Resource Sharing). Il browser controllerà se una determinata intestazione HTTP ( Access-Control-Allow-Origin ) è impostata e che il dominio del sito richiedente è elencato nel valore dell'intestazione. Se lo è, il browser consentirà di stabilire connessioni AJAX.

Tuttavia, poiché gli sviluppatori non possono modificare le intestazioni di risposta di altri server, non è sempre possibile fare affidamento su questo metodo.

Metodo 2: JSONP

Il JSON con P aggiunta è comunemente considerato come una soluzione alternativa. Non è il metodo più diretto, ma svolge ancora il lavoro. Questo metodo sfrutta il fatto che i file di script possono essere caricati da qualsiasi dominio. Tuttavia, è fondamentale ricordare che la richiesta di codice JavaScript da fonti esterne è sempre un potenziale rischio per la sicurezza e questo dovrebbe essere generalmente evitato se è disponibile una soluzione migliore.

I dati richiesti utilizzando JSONP sono tipicamente JSON , il che accade per adattarsi alla sintassi utilizzata per la definizione dell'oggetto in JavaScript, rendendo questo metodo di trasporto molto semplice. Un modo comune per consentire ai siti Web di utilizzare i dati esterni ottenuti tramite JSONP è quello di avvolgerli all'interno di una funzione di callback, che viene impostata tramite un parametro GET nell'URL. Una volta caricato il file di script esterno, la funzione verrà richiamata con i dati come primo parametro.

<script>
function myfunc(obj){
    console.log(obj.example_field);
}
</script>
<script src="http://example.com/api/endpoint.js?callback=myfunc"></script>

Il contenuto di http://example.com/api/endpoint.js?callback=myfunc potrebbe essere simile al seguente:

myfunc({"example_field":true})

La funzione deve sempre essere definita per prima, altrimenti non verrà definita quando viene caricato lo script esterno.

Comunicazione incrociata sicura con i messaggi

Il metodo window.postMessage() insieme al relativo gestore di eventi window.onmessage può essere utilizzato in modo sicuro per abilitare la comunicazione tra origini.

Il metodo postMessage() della window destinazione può essere chiamato per inviare un messaggio ad un'altra window , che sarà in grado di intercettarlo con il suo gestore di eventi onmessage , elaborarlo e, se necessario, inviare una risposta alla finestra del mittente usando postMessage() nuovo.

Esempio di finestra che comunica con una cornice per bambini

  • Contenuto di http://main-site.com/index.html :

     <!-- ... -->
     <iframe id="frame-id" src="http://other-site.com/index.html"></iframe>
     <script src="main_site_script.js"></script>
     <!-- ... -->
    
  • Contenuto di http://other-site.com/index.html :

     <!-- ... -->
     <script src="other_site_script.js"></src>
     <!-- ... -->
    
  • Contenuto di main_site_script.js :

     // Get the <iframe>'s window
     var frameWindow = document.getElementById('frame-id').contentWindow;
    
     // Add a listener for a response
     window.addEventListener('message', function(evt) {
         
         // IMPORTANT: Check the origin of the data! 
         if (event.origin.indexOf('http://other-site.com') == 0) {
             
             // Check the response
             console.log(evt.data);
             /* ... */
         }
     });        
    
     // Send a message to the frame's window
     frameWindow.postMessage(/* any obj or var */, '*');
    
  • Contenuto di other_site_script.js :

     window.addEventListener('message', function(evt) { 
    
         // IMPORTANT: Check the origin of the data! 
         if (event.origin.indexOf('http://main-site.com') == 0) {
             
             // Read and elaborate the received data
             console.log(evt.data);
             /* ... */
    
             // Send a response back to the main window
             window.parent.postMessage(/* any obj or var */, '*');
         }
     });
    


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow