Vai al contenuto principale
riqo.ioStrumenti per grandi idee

HTML entities, escaping e sicurezza del markup

Entità HTML, riferimenti numerici, escaping contestuale, sanitization e relazione con la prevenzione XSS.

Perché esistono i character reference

HTML usa alcuni caratteri come parte della sintassi del markup. I character reference permettono di rappresentare caratteri quando la forma letterale sarebbe ambigua, scomoda o non disponibile, usando nomi come & oppure riferimenti numerici.

Non ogni carattere deve essere trasformato in entity. HTML moderno gestisce Unicode direttamente; le entity sono soprattutto necessarie per caratteri con ruolo sintattico o per rappresentazioni convenzionali.

Named e numeric references

Le named character references associano nomi definiti dallo standard a caratteri o sequenze; i riferimenti numerici usano il code point in decimale o esadecimale. Entrambe le forme vengono risolte dal parser HTML nel testo risultante.

Il riferimento numerico riguarda un code point Unicode, non i byte UTF-8 con cui il documento viene trasmesso. Encoding del file e sintassi delle entity sono livelli distinti.

Escaping dipende dal contesto

Testo HTML, valori di attributo, URL, CSS e JavaScript embedded hanno grammatiche diverse. L'escaping corretto deve conoscere il contesto di output: una sostituzione adatta a un text node può essere insufficiente o sbagliata dentro uno script.

Per questo i template engine sicuri applicano escaping contestuale. Disattivare l'auto-escaping o concatenare manualmente markup con input non fidato aumenta il rischio di interpretazione come codice.

Escaping e sanitization

Escaping tratta dati come testo all'interno di un contesto specifico. Sanitization, invece, riceve markup potenzialmente attivo e rimuove o limita elementi, attributi e URL secondo una policy.

Se un'applicazione vuole consentire un sottoinsieme di HTML prodotto dagli utenti, non basta sostituire < e >. Serve un sanitizer HTML robusto e aggiornato che lavori sulla struttura analizzata.

XSS e confini di fiducia

Cross-site scripting nasce quando dati controllabili da un attaccante raggiungono un contesto eseguibile nel browser. La prevenzione richiede output encoding contestuale, sanitization quando si accetta HTML e API che evitino sink pericolosi.

Le entity non sono un filtro di sicurezza universale: un valore può essere sicuro come testo e pericoloso se successivamente decodificato o inserito in un altro contesto. Segui l'intero percorso dei dati.

Best practice

Mantieni UTF-8 end-to-end, lascia l'escaping al framework quando possibile e non eseguire decode/encode ripetuti senza un contratto chiaro. Testa caratteri speciali, virgolette, ampersand e input Unicode ai confini.

Quando il requisito è mostrare testo, usa primitive che producono text node. Quando devi accettare markup, definisci una allowlist e usa librerie di sanitization mature invece di espressioni regolari o sostituzioni ad hoc.

Guide correlate

Escaping vs sanitization: contesti HTML e prevenzione XSS

Perché escaping contestuale e sanitization risolvono problemi diversi e come evitare interpretazioni attive di input non affidabile.