Le stringhe non attendibili devono essere sterilizzate lato server se vengono inserite nel corpo del documento tramite document.createTextNode?

1

Chat webapp. I client (ovvero i browser Web) inviano messaggi al server, che il server trasmette a tutti i client connessi. Il codice lato client è simile a questo:

let p = document.createElement('p')
p.appendChild(document.createTextNode(message))
document.getElementById('chatbox').appendChild(p)

Dove message è la stringa ricevuta dal server.

Il problema qui è che è strongmente raccomandato per disinfettare i dati non affidabili sul lato server prima di inserirli nel corpo del documento, rimuovendo caratteri speciali ( < , > , " , ecc.) e sostituendoli con entità HTML appropriate. Mi è stato detto che il codice precedente era vulnerabile all'XSS se questo non è stato fatto .

Tuttavia, tale sanitizzazione sembra portare alla visualizzazione errata dei messaggi se viene utilizzato document.createTextNode . A differenza di innerHTML , document.createTextNode mostra caratteri speciali verbatim e non li interpreta come HTML . Pertanto la disinfezione lato server che cambia i caratteri sopra citati in entità HTML farà sì che i client visualizzino le entità, non i caratteri che le entità dovrebbero rappresentare .

Pertanto non credo che tale convalida sia necessaria né corretta quando viene utilizzato document.createTextNode() .

Tuttavia, mi è stato detto che è comunque sempre necessario disinfettare il lato server delle stringhe non attendibili. Mi è stato detto che sfuggire a questi caratteri dal lato server era sempre necessario. In tal caso, dovrei smettere di usare document.createTextNode() e iniziare a usare innerHTML invece? Mi sembra strano perché ho sempre pensato che innerHTML sia una delle least caratteristiche di sicurezza di JavaScript, che non dovrebbe essere usata con contenuti non fidati.

    
posta gaazkam 26.08.2018 - 00:53
fonte

1 risposta

1

L'input in createTextNode , textContent e% non-standard% co_de tutti prendono semplici stringhe JavaScript. Non è necessario e non dovrebbe codificare quell'input come HTML, le semplici stringhe JS sono tutto ciò che serve.

Detto questo, hai ancora bisogno di codificare correttamente il messaggio dal server. Se stai trasmettendo il testo come HTML, lo codificheresti con le entità HTML. Se stai trasmettendo il messaggio come JavaScript o JSON, di solito lo codifichi con un codificatore JSON. La codifica corretta dipende dal contesto in cui viene emessa e non è sempre HTML.

    
risposta data 26.08.2018 - 03:18
fonte

Leggi altre domande sui tag