Il punto più importante da sottolineare, IMHO, è che dovresti sapere cosa contiene una variabile (o un campo di database). Devi sapere se è testo (e quale set di caratteri / codifica è, in quel caso), o è HTML (o un attributo HTML, che è ancora un altro tipo di dati), o SQL, ecc.
Quindi, è necessario applicare alle conversioni appropriate quando è necessario passare dall'una all'altra.
Il grosso problema è che in molti casi, la rappresentazione di una parte di testo (probabilmente il tipo più comune di dati che puoi manipolare) è lo stesso sia che si tratti di testo, HTML, SQL, ecc. (il testo "abc" è lo stesso dell'HTML abc
o dell'SQL 'abc'
) e per questo motivo le persone tendono a concatenare i bit insieme senza alcuna conversione.
Ma ciò si interromperà non appena incontrerai caratteri che hanno un significato speciale in uno dei contesti. Questo non solo porta a problemi di sicurezza (sia XSS che SQL injection), ma anche a problemi di formattazione (abbiamo visto tutti siti che iniziano a mostrare entità HTML come <
quando dovrebbero visualizzare <
), poiché le persone dimenticano la conversione o la fanno più volte.
È abbastanza raro che tu abbia effettivamente bisogno di consentire l'input dell'HTML effettivo. Nella maggior parte dei casi, vuoi del testo. Mantieni il testo così com'è, manipolalo così com'è. Ma una volta che desideri visualizzarlo (su una pagina HTML), convertilo in HTML (utilizzando librerie / framework standard e testati , non la tua ricerca e sostituzione improvvisata basata su regex).
Allo stesso modo, lo converti quando vuoi costruire una richiesta SQL (usando query parametrizzate, preferibilmente). Ma lo memorizzi ancora esattamente così com'è.
Molti framework aggiungeranno livelli di astrazione che "nascondono" tutto questo se li usi effettivamente. Ma sappiamo tutti che anche con gli strumenti migliori, ti ritroverai sempre con qualcuno che cerca di creare un po 'di HTML da solo, quindi deve sapere cosa deve essere fatto se lo fa.
Se vuoi / hai bisogno di manipolare l'HTML effettivo, allora inserisci una dimensione completamente diversa in termini di problemi XSS. Nota che può essere coperto in un'ora ...