Il punto più importante da fare, IMHO, è che dovresti sapere che cosa contiene una variabile (o un campo del database). Devi sapere se è testo (e quale charset / codifica è, in quel caso), o è HTML (o un attributo HTML, che è ancora un altro tipo di dati), o SQL, ecc.
Quindi, devi applicare alle conversioni corrette quando devi spostarti da una posizione all'altra.
Il grosso problema è che in molti casi, la rappresentazione di un pezzo di testo (probabilmente il tipo più comune di dati che è possibile manipolare) è la stessa sia che si tratti di testo, HTML, SQL, ecc. (il testo "abc" è uguale a HTML abc
o SQL 'abc'
) e per questo motivo le persone tendono a concatenare i bit insieme senza alcuna conversione.
Ma ciò si interromperà non appena incontri personaggi che hanno un significato speciale in uno dei contesti. Ciò non solo porta a problemi di sicurezza (sia iniezioni XSS e SQL), ma anche a problemi di formattazione (tutti abbiamo visto siti che iniziano a mostrare entità HTML come <
quando dovrebbero visualizzare <
), poiché le persone dimenticano la conversione, o fallo più volte.
È abbastanza raro che sia effettivamente necessario consentire l'inserimento di un vero e proprio codice HTML. Nella maggior parte dei casi, vuoi il testo. Basta mantenere il testo così com'è, manipolarlo così com'è. Ma una volta che vuoi visualizzarlo (su una pagina HTML), convertilo in HTML (usando le librerie / framework standard e testati , non la tua ricerca e sostituzione improvvisata basata su espressioni regolari).
Allo stesso modo, lo si converte quando si vuole costruire una richiesta SQL (usando le query parametrizzate, preferibilmente). Ma lo memorizzi esattamente così com'è.
Molti framework aggiungeranno livelli di astrazione che "nasconderanno" tutto ciò se effettivamente li utilizzi. Ma sappiamo tutti che anche con gli strumenti migliori, finirai sempre con qualcuno che cerca di costruire un po 'di HTML, quindi devono sapere cosa deve essere fatto se lo fanno.
Se desideri / devi manipolare l'HTML effettivo, inserisci una dimensione completamente diversa in termini di problemi XSS. Si noti che può essere coperto in un'ora ...