Output
Quando un output unicode viene convertito in un set di caratteri a 8 bit, a volte viene eseguito con una conversione "best effort". I personaggi che non hanno una corrispondenza esatta vengono convertiti in qualcosa di simile, quindi forse "a con circonflesso" diventa "a". Questo può essere estremamente pericoloso per la sicurezza. C'è un carattere unicode "mezza larghezza inferiore al segno". I browser non riconoscono questo come l'inizio di un tag, quindi di solito non viene salvato. Tuttavia, su una conversione best effort può essere tradotto in un normale < e questo può causare un difetto XSS. Questa non è solo una preoccupazione teorica; Ho visto questo in natura. Alcune informazioni qui .
Nella maggior parte dei casi, la soluzione migliore è usare utf-8 ovunque. Se questo non è possibile, dovresti fare una conversione rigorosa, piuttosto che i migliori sforzi. E se ciò non è possibile, allora devi fare la conversione dei migliori sforzi PRIMA di fare qualsiasi fuga.
ingresso
C'è una regola molto semplice per evitare problemi: decodifica prima di convalidare . Qualunque set di caratteri tu riceva (o codifica URL, ecc.) - decodificalo completamente prima di convalidare o eseguire qualsiasi operazione sui dati. Se segui questa regola, dovresti essere bravo, anche se ci sono difetti nella tua decodifica (ad esempio accettando lunghe sequenze utf-8).