Penso che il modo migliore per descrivere la canonicalizzazione sia ricordare che deriva da canon , che significa un autentico pezzo di scrittura. Ciò di cui stanno parlando è l'acquisizione di dati non attendibili e la loro formattazione come rappresentazione non ambigua, tale da non poter mai essere travisata da alcun processo software.
Il primo passo è prendere il tuo contributo e memorizzarlo da qualche parte. Il tuo input potrebbe essere codificato come ASCII, UTF-8, UTF-16 o qualsiasi altro numero di schemi di codifica. Il software deve rilevarlo e convertire e archiviare in modo appropriato i dati in un unico formato. Ora è in un unico formato non ambiguo, e quindi è noto per essere corretto quando interpretato come tale, cioè è canon . Ciò consente la certezza assoluta quando si emettono i dati successivamente.
Ad esempio, se inserisco '; DROP TABLE users; --
in un modulo, potrebbe causare un'iniezione SQL se l'app è scritta male. Tuttavia, con la canonicalizzazione, i dati sono solo dati e non possono essere rappresentati come parte di una query SQL. In realtà, la forma di canonicalizzazione di SQL è query parametrizzate. Inoltre, è necessario eseguire dei passaggi per convertire la codifica del testo in un singolo tipo noto, in modo che vengano memorizzati solo i punti di codice validi. Se ciò non viene fatto, un punto di codice può essere interpretato erroneamente come un altro carattere.
Un esempio simile può essere dato per l'output in HTML. Se il database contiene <script>alert('xss!');</script>
, un'app naive potrebbe semplicemente scriverla direttamente nella pagina e introdurre un problema di sicurezza. Tuttavia, con una corretta canonizzazione sotto forma di codifica dell'output, otterremmo <script>alert('xss!');</script>
, che un browser non può interpretare in modo errato.
La doppia codifica è un trucco usato per ingannare certi parser. L'autore dell'attacco identifica la codifica che stai utilizzando, quindi esegue la pre-codifica dei dati in questo formato. Il parser assume erroneamente che i dati siano canon e li gestisce come tali. Il risultato è che i dati sono maltrattati, così che si verifica un exploit. È un attacco di offuscamento, perché l'utente malintenzionato sta offuscando i dati di exploit, in modo che l'encoder non veda caratteri non validi.