2009-10-24 14 views
9

Ho iniziato di recente a creare applicazioni Web utilizzando .NET MVC e mi sono imbattuto in questo post sul blog di Phil Haack: JSON Hijacking. Per quelli di voi che non sono a conoscenza di questa vulnerabilità quando si usa JSON per trasferire dati sensibili, è davvero una lettura obbligata.Preferisci racchiudere gli array JSON in un altro oggetto JSON o richiedere sempre il POST per impedire JSON Hijacking?

Sembra che ci siano tre modi per gestire questa vulnerabilità.

  1. Richiedere un POST al posto di GET nel servizio JSON.
  2. Includi le risposte dell'array JSON in un oggetto JSON.
  3. Non esporre dati sensibili in ogni servizio che non è protetto da 1 o 2.

La terza alternativa non è realmente un'opzione in quanto limita in realtà l'uso di JSON.

Quindi quale degli altri due preferisci?

L'anteprima di .NET MVC 2 richiede un POST per le risposte JSON per impostazione predefinita, penso che questo sia un ottimo modo per proteggere qualsiasi sviluppatore che non conosce ancora questo problema. Ma a me sembra un po '"hacky" interrompere REST in questo modo. A meno che qualcuno non me ne parli, mi sto impegnando per avvolgere i miei array in un altro oggetto e scartarlo dal lato client.

risposta

7

io personalmente avvolgere tutte le mie risposte in un commento:

/* { 
    "foo": 3, 
    "bar": "string with *\x2F sequence in" 
} */ 

e striscia che prima di JSON.parsing. Ciò lo rende inutile come target per i tag di script.

Vale la pena notare che questo problema non riguarda solo JSON, ma qualsiasi risposta HTTP che viene utilizzata potrebbe essere interpretata come JavaScript. Persino, ad esempio, un file di testo protetto da .htaccess è vulnerabile a perdite attraverso l'inclusione di tag script di terze parti, se si trova in un formato che risulta essere JavaScript valido.

Ed ecco il crunch: grazie a E4X, anche i normali documenti XML statici sono validi anche JavaScript. E4X è un'estensione disastrosa e inutile di JavaScript, implementata e inventata su Mozilla, che ti permette di scrivere letteralmente i letterali XML <element>content</element> in JS; in quanto tale, un file XML protetto è ora vulnerabile agli stessi rischi di trafilamento tra i siti come JSON. Grazie Mozilla. Vedi l'articolo di Google doctype su questo.

+0

l'articolo E4X si parla parla di rischi per la sicurezza nella direzione opposta: che i consumatori * * di dati E4X devono stare attenti a eseguirla w/o analisi. Se produci * dati e4x, qual è la preoccupazione? –

+0

La pagina indirizza l'iniezione in entrambe le direzioni. Precedentemente (e ancora in Firefoxen precedente) è possibile modificare il prototipo XML per ottenere l'accesso agli oggetti E4X appena creati per script esterni e sussistono ancora potenziali pericoli per il contenuto JavaScript nidificato in E4X per richiamare i callback degli hacker.Questo vale in particolare per le pagine che includono contenuti forniti dagli utenti malintenzionati, anche se opportunamente sfuggiti. – bobince

0

Poiché si tratta sostanzialmente di un attacco CSRF, è possibile inserire un token (ad esempio hash di ID di sessione e segreto) in ciascuna delle chiamate JSON e verificare la validità di tale token sul server. È lo stesso che dovresti fare per le regolari richieste POST comunque.

+0

Ciò impedisce solo la pubblicazione di dati impersonando qualcun altro. Non impedisce al malintenzionato di rubare informazioni sensibili offerte da un servizio GET JSON. –

+0

Il cattivo deve conoscere il token, ma non penso che ci sia un modo per ottenerlo. Per favore dimmi che sbaglio. – stefanw

+0

@stefanw l'articolo collegato nella domanda indica che i dati potrebbero essere memorizzati nella cache, quindi controllare le intestazioni non aiuta. Penso che lo stesso valga per il controllo di un token CSRF. – Flash