2013-04-29 14 views
112

Sto utilizzando Backbone.js e il server Web di Tornado. Il comportamento standard per la ricezione dei dati di raccolta in Backbone è quello di inviare come array JSON.JSON Hijacking è ancora un problema nei browser moderni?

D'altra parte, il comportamento standard di Tornado è di non permettere Array di JSON a causa del seguente vulnerabilità:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

A un correlato è: http://haacked.com/archive/2009/06/25/json-hijacking.aspx

ci si sente più naturale per me non dover avvolgere il mio JSON in un oggetto quando è veramente una lista di oggetti.

Non è stato possibile riprodurre questi attacchi nei browser moderni (ovvero Chrome, Firefox, Safari e IE9 correnti). Allo stesso tempo non ero in grado di confermare da nessuna parte che i moderni browser avessero risolto questi problemi.

Per assicurarsi che non sto indurre in errore da eventuali scarsa programmazione competenze né poveri googling competenze:

sono questi attacchi JSON Hijacking ancora un problema oggi per i browser moderni?

(Nota: Ci scusiamo per l'eventuale duplicato:. Is it possible to do 'JSON hijacking' on modern browser? ma dal momento che la risposta accettata non sembra rispondere alla domanda - ho pensato che era giunto il momento di chiedere di nuovo e ottenere alcune spiegazioni più chiare)

+0

utilizzando eval? quindi possibile altrimenti No. Se nulla è stato modificato o modificato in modo da ottenere una risposta di analisi della spina dorsale, si dovrebbe essere sicuri – Deeptechtons

+6

In generale, non si dovrebbe mai avvicinarsi alla sicurezza Web con l'ipotesi che qualcuno utilizzi un browser "moderno". – Luke

+5

@Luke - Vedi sotto commento a Reid. Ottimo punto in generale - ma non sto chiedendo una domanda di sicurezza generale. (I miei utenti potranno solo autenticarsi se utilizzano un browser moderno in primo luogo.) – Rocketman

risposta

81

No , non è più possibile catturare valori passati ai [] o {} costruttori in Firefox 21, Chrome 27, o IE 10. Ecco una pagina di prova po ', sulla base dei principali attacchi descritti in http://www.thespanner.co.uk/2011/05/30/json-hijacking/:

http://jsfiddle.net/ph3Uv/2/

Sostituisce window.Array e aggiunge un setter a Object.prototype.foo e verifica l'inizializzazione di matrici e oggetti tramite i moduli lunghi e corti.

ES4 spec, nella sezione 1.5, "richiede i collegamenti globali e standard di Object e Array da utilizzare per costruire nuovi oggetti per gli inizializzatori di oggetti e array" e note in Precedent di implementazione che "Internet Explorer 6, Opera 9.20 e Safari 3 non rispetta le riconferimenti locali o globali di Object e Array, ma usa i costruttori Object e Array originali. " Questo viene mantenuto in ES5, section 11.1.4.

Allen Wirfs-Brock explained che ES5 specifica anche che l'inizializzazione dell'oggetto non deve attivare i setter, poiché utilizza DefineOwnProperty. MDN: Working with Objects nota che "A partire da JavaScript 1.8.1, i setter non vengono più chiamati quando si impostano le proprietà negli inizializzatori di oggetti e array". Questo è stato risolto in V8 issue 1015.

+18

Nel 2009 Brendan Eich ha suggerito che i browser non valutano gli script serviti come application/json (https://bugzilla.mozilla.org/show_bug.cgi?id=376957#c75), che mi sembra ancora una buona idea. –

+2

Nota che il POST CSRF cieco è ancora possibile utilizzando i form, in particolare con la codifica text/plain, e deve essere sconfitto usando token/nonces. –

+1

Sì al CSRF POST. Grazie per tutte le tue fantastiche informazioni qui. – Rocketman

Problemi correlati