2014-12-10 15 views
7

Ho una domanda riguardante un potenziale problema di sicurezza/limitazione relativo a JavaScript ospitato su un dominio (es: dominio di una CDN, ad esempio example.com), ma caricato da un sito Web in un dominio diverso (ad esempio, esempio.net).Un codice JavaScript ospitato su un dominio diverso può leggere/modificare il DOM di un altro dominio?

Ora immagina che il JavaScript caricato leggerà/modificherà il testo in un div con un particolare ID, quindi niente "complicato". Un esempio: ho lo script caricati da http://example.com/myscript.js, e giustiziato il http://example.net/index.html: [notare la diversa TLD!]

<!-- Page example.net/index.html --> 
<script src="http://example.com/myscript.js"></script> 

So che non posso accedere al cookie sotto mysite.com dal JavaScript, ma io può accedere a tutti i DOM sulla pagina e, nel caso, modificarlo. Non è questo un possibile problema di sicurezza? Non dovrebbe questo innescare la protezione della stessa origine politica?

Esistono agenti utente che impediscono a un JavaScript ospitato su un dominio diverso di accedere agli elementi nella pagina che esegue lo script?

E, inoltre, l'esempio sopra funzionerà anche su pagine HTTPS? (Es: https://example.net/index.html carichi lo script da https://example.com/myscript.js)

risposta

10

Tutte le restrizioni di sicurezza basati su URL in JavaScript lato client si basano sulla URL della pagina web contenente l'elemento <script> che carica il JS.

L'URL a cui JS è ospitato è irrilevante.


Ora, so che non posso accedere al cookie sotto mysite.com dal JS.

Lo script viene caricato in example.net e ospitato su example.com. Può leggere i cookie da example.net. Non può leggere i cookie da example.com. (Il codice lato server su example.com potrebbe generare dinamicamente il codice JavaScript e incorporare i dati eliminati dai cookie).


Ma, posso accedere a tutto il DOM della pagina, e, nel caso in cui, modificarlo.

Non è questo un possibile problema di sicurezza? Non dovrebbe questo innescare la protezione della stessa origine politica?

È un potenziale problema di sicurezza, ma non deve attivare la stessa politica di origine.

Caricando lo script, l'autore della pagina si fida del sito che ospita lo script.

Non incorporare JS da siti di cui non ci si fida.


E, inoltre, sarà l'esempio precedente lavoro anche sulle pagine HTTPS?(Es: https://example.net/index.html carichi lo script da https://example.com/myscript.js)

URL con schemi diversi hanno origini diverse, proprio come gli URL con diversi nomi di host. Le regole della politica Same Same sono le stesse in quanto sono basate sull'origine e non su particolari caratteristiche delle origini.

A volte si otterranno ulteriori restrizioni in cui una pagina caricata su HTTPS non potrà accedere al contenuto caricato su HTTP poiché ciò interrompe la sicurezza SSL. Questa è una restrizione di sicurezza diversa che non è correlata alla stessa politica di origine.

+0

Sì, ed è esattamente il motivo per cui i CDN vengono utilizzati per caricare i file js. –

+0

Grazie per la risposta dettagliata. Per quanto riguarda i cookie, se voglio impostare un cookie "globale" da example.com (cookie inviato tramite intestazione Set-Cookie in risposta che contiene lo script JS), può essere letto da tutti i siti che caricano lo script da example.com (il CDN), dovrei presumere che questo è impossibile, giusto? –

+0

corretto. Vedere la nota nella risposta sull'utilizzo del codice lato server. – Quentin

3

Non si tratta di un problema di sicurezza?

Sì, questo è chiamato Cross-Site-Scripting (XSS).

È sicuramente un problema di sicurezza.

Bottom line, mai include codice, da qualsiasi dominio, di cui non ci si fida. Fine della storia.

Se un utente malintenzionato può ottenere codice in esecuzione sul tuo dominio, è game over.

Non dovrebbe attivare la protezione della stessa origine?

No.

La stessa origine-politica pratica significa che lo script può sempre e solo visualizzare/modificare il DOM del dominio a cui è stato caricato. Pertanto, non è possibile creare un iframe in un sito arbitrario e leggerlo dal genitore a meno che CORS sia attivo o lo script sia in esecuzione anche in questo caso.

Forse, ci sono agenti utente che impediscono a un Javascript, ospitato su un dominio diverso, di accedere agli elementi nella pagina che esegue lo script?

L'unico modo per fare questo, è quello di sandbox che javascript all'interno di un iframe che è in un dominio diverso.

Quindi è possibile creare un dominio sandbox.example.com, che genera una pagina wrapper che include il javascript.

Quindi, anziché collegarsi direttamente al JS, creare un iframe nel dominio sandbox. Il JS avrà accesso a quel dominio e tutto in quel DOM, ma nulla al di fuori dell'iframe.

Devi ancora fare attenzione a impostare i cookie correttamente (non fare domini con caratteri jolly, ecc.). Ma è può aiuto.

Problemi correlati