Il original XHR non è mai stato progettato per consentire richieste di origine incrociata. Il motivo era una vulnerabilità di sicurezza tangibile che è nota principalmente da CSRF attacks.
In questo scenario di attacco, un sito di terze parti può costringere lo user agent di una vittima a inviare richieste contraffatte ma valide e legittime al sito di origine. Dal punto di vista del server di origine, tale richiesta forgiata non è indiscernibile da altre richieste da parte dell'utente che sono state avviate dalle pagine Web del server di origine. Il motivo è che in realtà è l'agente utente che invia queste richieste e includerebbe automaticamente anche tutte le credenziali come i cookie, l'autenticazione HTTP e persino i certificati SSL sul lato client.
Ora tali richieste possono essere facilmente falsificate: a partire da semplici richieste GET utilizzando <img src="…">
fino alle richieste POST utilizzando i moduli e inviandoli automaticamente.Questo funziona fintanto che è prevedibile come forgiare richieste così valide.
Ma questo non è il motivo principale per vietare richieste di cross-origine per XHR. Perché, come mostrato sopra, ci sono modi per falsificare le richieste anche senza XHR e anche senza JavaScript. No, il motivo principale per cui XHR non consentiva le richieste di origine incrociata è perché sarebbe il JavaScript nella pagina web della terza parte a cui sarebbe inviata la risposta. Quindi non sarebbe solo possibile inviare richieste di origine incrociata ma anche ricevere la risposta che può contenere informazioni sensibili che sarebbero poi accessibili da JavaScript.
Ecco perché la specifica XHR originale non consentiva richieste di origine incrociata. Ma con l'avanzare della tecnologia, ci sono state richieste ragionevoli per supportare richieste di origine incrociata. Ecco perché la specifica XHR originale è stata estesa a XHR level 2 (XHR e XHR livello 2 sono ora uniti) in cui l'estensione principale supporta le richieste di origine incrociata in base a requisiti specifici specificati come CORS. Ora il server ha la possibilità di verificare l'origine di una richiesta ed è anche in grado di limitare il set di origini consentite e l'insieme di metodi HTTP e campi di intestazione consentiti.
Da ora a JSONP: per ottenere la risposta JSON di una richiesta in JavaScript ed essere in grado di elaborarla, dovrebbe essere una richiesta di origine uguale o, nel caso di una richiesta di origine incrociata, il server e l'agente utente dovrebbe supportare CORS (di cui quest'ultimo è supportato solo dai browser moderni). Ma per essere in grado di lavorare con qualsiasi browser, è stato inventato JSONP che è semplicemente una chiamata di funzione JavaScript valida con il JSON come parametro che può essere caricato come JavaScript esterno tramite <script>
che, simile a <img>
, non è limitato alla stessa origine richieste. Ma oltre a qualsiasi altra richiesta, una richiesta JSONP è anche vulnerabile a CSRF.
Quindi, per concludere che, dal punto di vista della sicurezza: è necessario
- XHR per fare richieste di risorse JSON per ottenere le loro risposte in JavaScript
- XHR2/CORS è tenuto ad effettuare le richieste cross-origine per le risorse JSON per ottenere le loro risposte in JavaScript
- JSONP è una soluzione per aggirare le richieste cross-origine con XHR
Ma anche:
- richieste forgiatura è risibile facile, anche se forgiare le richieste valide e legittime è più difficile (ma spesso abbastanza facile così)
- attacchi CSRF non sono un essere sottovalutati minaccia, in modo da imparare a protect against CSRF
Appartiene a http://security.stackexchange.com/ – Knu