2008-09-09 7 views
20

Mentre lo scripting cross-site è generalmente considerato negativo, ho incontrato diverse situazioni in cui è necessario.Best practice: legittima cross-site scripting

recentemente stavo lavorando all'interno dei confini di un sistema di gestione dei contenuti molto limitante. Avevo bisogno di includere il codice del database all'interno della pagina, ma il server di hosting non aveva nulla di utilizzabile disponibile. Ho creato un paio di script bare-bones sul mio server, originariamente pensando che avrei potuto usare AJAX per importare i contenuti dei miei script direttamente nel template del CMS (conservando così immagini dinamiche, voci di menu, CSS, ecc.). Mi sbagliavo.

A causa delle limitazioni di XMLHttpRequest oggetti, non è possibile afferrare il contenuto da un dominio diverso. Così ho pensato iFrame - anche se non sono un fan dei frame, ho pensato che avrei potuto creare una cornice che corrispondesse alla larghezza e all'altezza del contenuto, in modo che appaia nativa. Di nuovo, sono stato bloccato da "protezioni" di scripting cross-site. Mentre potrei effettivamente caricare un file remoto nel iFrame, non ho potuto eseguire JavaScript per modificare le sue dimensioni sulla pagina host o nella pagina caricata.

In questo scenario particolare, non ero in grado di puntare un sottodominio al mio server. Inoltre, non sono riuscito a creare uno script sul server CMS in grado di eseguire il proxy del contenuto dal mio server, quindi il mio ultimo pensiero è stato quello di utilizzare un codice JavaScript remoto.

funziona Un JavaScript remoto. Si interrompe quando l'utente ha disabilitato JavaScript, che è uno svantaggio; ma funziona Il "problema" che stavo usando con un JavaScript remoto era che dovevo usare la funzione JS document.write() per stampare qualsiasi contenuto. Qualsiasi output che non sia JS causa errori di script. Oltre all'utilizzo di document.write() per ogni riga, è inoltre necessario assicurarsi che il contenuto sia sfuggito, altrimenti si avranno più errori di script.

mia soluzione è stata la seguente:

Il mio script ha ricevuto un parametro GET ("pagina") e poi guardò per il file ({$page}.php), e leggere il contenuto in una variabile. Tuttavia, ho dovuto utilizzare le tecniche di buffering per eseguire effettivamente gli script inclusi (per cose come l'interazione con il database), quindi rimuovere il contenuto finale di tutti i caratteri di interruzione di riga (\n) seguito dall'escaping di tutti i caratteri richiesti. Il risultato finale è che il mio script originale (che emette JavaScript) accede a script apparentemente "standard" sul mio server e converte il loro output standard in JavaScript per la visualizzazione all'interno del modello CMS.

Anche se questa soluzione funziona, sembra che ci può essere un modo migliore per ottenere la stessa cosa. Qual è il modo migliore per fare in modo che lo scripting cross-site funzioni in modo specifico allo scopo di includere contenuti da un dominio completamente diverso?

risposta

14

Hai tre scelte:

  1. Creare un server side proxy script.
  2. Creare uno script remoto da leggere in HTML dinamico remoto. Utilizzare una libreria come jQuery per semplificare la procedura. È possibile utilizzare load function per iniettare HTML dove necessario. EDIT Ciò che originariamente intendevo per esempio # 2 era l'utilizzo di JSONP, che richiede che lo script lato server riconosca il "callback =?" param.

  3. Utilizzare un client side Flash proxy e impostare un file crossdomain.xml sulla radice Web del server.

+0

Vuoi chiarire # 2? Per dataType 'html', come in load(), jQuery usa XMLHttpRequest, che non funziona cross-site. Inoltre, load() rimuove i tag di script. –

+0

Mi spiace, quello che intendevo per # 2 sta usando JSONP http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 –

1

Personalmente, chiamerei quell'altro dominio sul server e ottenere e analizzare i dati lì per l'utilizzo nella pagina. In tal modo si evitano problemi e si ottiene la potenza di una lingua/piattaforma lato server per ottenere e analizzare i dati.

Non sono sicuro se che avrebbe funzionato per il vostro scenario specifico ... difficile sapere anche con la tua descrizione dettagliata ...

0

ho incontrato che YDN server side proxy script prima. Dice che è costruito per funzionare con le API di ricerca di Yahoo.

Funzionerà con qualsiasi dominio, se si limita semplicemente il codice API di Yahoo fuori? O hai bisogno di sostituirlo con il dominio con cui vuoi che funzioni?

1

Si potrebbe provare easyXDM, includendo pochissimo codice, è possibile passare dati o chiamate di metodo tra documenti di domini diversi.

0

il contenuto remoto iframe è accessibile tramite javascript locale.

Il server remoto deve solo impostare document.domain della pagina.

Esempio:

del sito contiene un iframe con src='Site B/home.php'

home.php assomiglia a questo:

[php stuff]...[/php] 
[script type='text/javascript']document.domain='Site A'[/script]