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.