Nella nostra applicazione web ci siamo imbattuti nella situazione in cui abbiamo bisogno di effettuare chiamate AJAX tra domini da un dominio che controlliamo completamente in un altro dominio che controlliamo completamente. Ho navigato in giro per la soluzione migliore e le due che mi vengono in mente sono un file proxy locale (file locale che utilizza php :: fopen) o jquery/JSONP.Quali sono i rischi della comunicazione JSONP tra domini diversi?
Quando guardo in linea, vedo le persone parlare abitualmente di come sia pericoloso utilizzare JSONP perché qualcuno potrebbe iniettare dati dannosi con esso. Il dilemma è che la maggior parte degli argomenti contro di essa non sembra trattenere molta acqua, quindi vengo qui per chiedere chiarimenti allo Stack.
Quali sono i vettori specifici di attacco che verranno aperti da JSONP tra domini diversi?
Dalla mia comprensione l'unico vettore per JSONP è esattamente lo stesso vettore, che è aperto includendo un tag <script>
sul tuo sito il cui src è quello di qualsiasi sito che non è controllato da voi: che potevano girare dannoso e inizia a coltivare sessioni utente/cookie/dati. Se ciò è vero, sembrerebbe che non sia il protocollo (JSONP) a preoccupare, ma piuttosto la fonte da cui i dati vengono raccolti.
Perché se si trattasse di un proxy lato server, un tag <script>
o ajax/JSONP, il rischio è che sto inserendo il contenuto di qualcun altro sulla mia pagina e che potrebbero iniziare a organizzare sessioni utente se si sentissero obbligati (in un modo che è esattamente ciò che Google Analytics fa con un tag script).
Molti vettori che ascolto online dipendono dalla convalida errata di moduli e dati inviati dall'utente. Nell'esempio, JSONP viene utilizzato per estrarre alcuni file, che inseriscono i dati in un modulo, quindi il modulo viene inviato per l'inserimento del database. Se i dati di tale modulo sono attendibili, poiché provengono da fonti attendibili (dati JSONP) e inseriti senza convalida, di nuovo non è il JSONP ad essere stato criticato, ma l'input dell'utente convalidato in modo errato. Un utente può fare esattamente le stesse modifiche a quel modulo usando Firebug, ma l'ultima volta che ho controllato nessuno ha chiamato Firebug un vettore di sicurezza.
L'ultimo elemento è la nozione che con il proxy server-side esiste una maggiore capacità di filtrare i risultati prima di passarli al client. Tuttavia, che si tratti di PHP o Javascript, potrei filtrare i risultati per rimuovere elementi come, onclick o iframe. Certo, qualcuno lato client potrebbe alterare la mia funzione javascript per rimuovere il filtro, ma il filtraggio influenzerebbe solo la specifica esperienza del cliente e non verrebbe alterato per altri utenti, impedendo in tal modo un attacco XSS permanente multi-cliente.
Ovviamente, ci sono alcuni vantaggi per il proxy lato server perché renderebbe più semplice la registrazione di potenziali attacchi XSS, ma in termini di prevenzione dell'attacco stesso sia PHP che Javascript sembrano avere utilità adeguate. In un certo senso, sembrerebbe che JSONP sia effettivamente più sicuro di un semplice tag <script>
perché almeno con JSONP il risultato passa attraverso una funzione che significa in qualche modo filtrata, piuttosto che solo un trust globale, come avviene con <script>
.
C'è qualche rischio che mi manchi o mi stia sfuggendo? Se comprendo correttamente il problema, non vi è alcun rischio per la sicurezza nell'utilizzo di JSONP per includere il contenuto di un file di cui ci fidiamo da una fonte attendibile. È una valutazione accurata?
SOLUZIONE
Se entrambe le estremità sono attendibili, non v'è alcun pericolo nel JSONP (è fondamentalmente solo un tag
<script>
).Entrambi Script/JSONP mantengono le stesse vulnerabilità di sicurezza perché vengono eseguiti automaticamente, anziché semplicemente trasmettere come dati. L'utilizzo di un proxy sul lato server significa che il ritorno tra domini viene passato come dati e può essere filtrato per contenuti dannosi. Se il dominio incrociato è completamente affidabile, allora JSONP/SCRIPT è sicuro, se si sospetta il rischio, passarlo attraverso un proxy di filtro.
Non è necessario creare un server proxy utilizzando 'fopen'. Si potrebbe anche usare 'mod_proxy' di Apache per servire le richieste dall'altro dominio. –