Perché i framework di template web HTML non sfuggono tutti i dati per impostazione predefinita?

5

Recentemente ho scoperto una vulnerabilità XSS in un'applicazione che utilizza JSP per il rendering delle pagine. Il codice vulnerabile nel JSP era qualcosa del genere:

<td>${customer.notes}</td>

È stato risolto eseguendo l'escape dell'ingresso controllato dall'utente, il codice risultante ha il seguente aspetto:

<td><c:out value="${customer.notes}"/></td>

JSP e altri framework di template che ho usato, sempre predefinito per l'escape dei dati dinamici solo quando richiesto specificatamente e non per l'escape di default.

L'inverso di questo è chiaramente un default molto più sicuro, cioè. tutti i dati dinamici sono sfuggiti, a meno che tu non specifichi esplicitamente al framework di non farlo.

Esistono strutture che funzionano in questo modo? C'è un grosso problema nel cambiare i quadri futuri per comportarsi in questo modo? Ovviamente si incorre nella fuga di dati che potrebbero non essere necessariamente controllati dall'utente, ma se si verificano problemi di prestazioni, è possibile disabilitarli ovunque siano sicuri. C'è qualcosa che mi manca?

    
posta oggmonster 10.06.2016 - 16:05
fonte

1 risposta

6

Are there any frameworks that work this way?

Certo. Twig o Django sarebbero due esempi.

The inverse of this is clearly a far more secure default, ie. all dynamic data is escaped, unless you specifically tell the framework not to.

Sì, questo è molto più sicuro.

Is there something I'm missing?

L'unico svantaggio è che XSS è sensibile al contesto. La codifica predefinita potrebbe non essere sufficiente [*] e potrebbe quindi portare a un falso senso di sicurezza.

D'altro canto, solo la codifica HTML ' , " , < e > cattureranno la maggior parte delle vulnerabilità XSS, quindi direi che è sempre una buona idea codificare per impostazione predefinita e fornire un'opzione per disabilitare la codifica di default se necessario.

Why don't web templating frameworks HTML escape all data by default?

JSP ad esempio è del 1999. XSS non è stato nemmeno chiamato XSS fino al 2000. La mia sensazione è che i motori più recenti abbiano più probabilità di codificare per impostazione predefinita, perché l'importanza dell'XSS è più elevata e maggiore è la sicurezza ( di default). I motori precedenti probabilmente non vogliono rompere la compatibilità all'indietro e quindi non cambiano il comportamento esistente.

[*] esempio molto semplice: <script>var x = foo.[USERINPUT]();</script> .

    
risposta data 11.06.2016 - 10:53
fonte

Leggi altre domande sui tag