Come posso evitare l'XSS riflesso nei miei servizi web JSON?

10

Ho un servizio web che accetta i dati POST (JSON) e restituisce parte dell'oggetto richiesta nella risposta JSON.

Questo è aperto a XSS se la risposta è resa HTML dal browser poiché qualcuno potrebbe aggiungere codice HTML arbitrario all'oggetto richiesta.

Qual è il modo standard per mitigarlo? Le opzioni attuali che posso pensare sono:

  • Consenti solo le richieste con X-Requested-With: XMLHttpRequest di intestazione per bloccare gli attacchi che fanno affidamento su richieste non Ajax al mio servizio
  • Invia la risposta con il tipo di contenuto application/json e spera che il browser rifiuti di renderlo come HTML
  • Codifica i caratteri non sicuri nella risposta (come faccio? usando \ uxxxx?)

Non sono riuscito a trovare un riferimento concreto su questo.

    
posta Flash 20.09.2012 - 04:25
fonte

3 risposte

4

Encode unsafe characters in the response (how do I do this? using \uxxxx?)

Sì. < a \u003C in particolare.

Potrebbe esserci un'opzione nel tuo encoder JSON per farlo già (es. in PHP, JSON_HEX_TAG ); in caso contrario, è semplice eseguire una sostituzione di stringa dopo la codifica. (Questo è sicuro in quanto non esiste un posto in cui < possa essere utilizzato legalmente in JSON tranne che in una stringa letterale.) A questo punto puoi anche includere il chaff principale per impedire l'inclusione di script tra origini.

Vorrei inviare come application/json come una questione di correttezza, ma non mi fiderei che ogni browser più vecchio debba necessariamente onorarlo. Affidarsi all'intestazione X-Requested-With è generalmente problematico in quanto non funziona bene con il caching, anche se potrebbe non essere un problema per te.

    
risposta data 20.09.2012 - 11:07
fonte
4

I seguenti punti dovrebbero essere tenuti a mente

  • La potenziale vulnerabilità XSS può essere evitata usando il corretto Tipo di contenuto. Tutte le risposte JSON devono utilizzare application/json tipo.

  • L'intestazione nosniff viene utilizzata per disabilitare lo sniffing del contenuto su vecchie versioni di Internet Explorer.

  • La primitiva esterna deve essere sempre un oggetto per le stringhe JSON:

Sfruttabile:

[{"object": "inside an array"}]

Non sfruttabile:

{"object": "not inside an array"}

Inoltre non sfruttabili:

{"result": [{"object": "inside an array"}]}
    
risposta data 14.11.2017 - 16:17
fonte
2

Imposta Content-Type su application / json, e imposta X-Content-Type-Options: nosniff (l'ultima intestazione indica al browser di usare il tipo di contenuto dato - nessun ulteriore indovinello). Potresti anche prendere in considerazione l'aggiunta di un'intestazione Content-Disposition: attachment. Questo verrà ignorato dalle richieste XHR, ma farà in modo che la finestra di dialogo del download si apra se un utente malintenzionato tenta di indurre un utente ad aprirlo direttamente nel browser.

Puoi anche dare un'occhiata a: link e link

    
risposta data 21.09.2012 - 07:51
fonte

Leggi altre domande sui tag