# Canonització (informàtica)

En ciències de la computació, la canonització (abreujat com c14n, on 14 representa el nombre de lletres entre la C i la N; també anomenada estandardització o normalització) és un procés per convertir dades que tenen més d'una representació possible en una forma "estàndard", "normal", o canònica. Això es fa per poder comparar si dues representacions diferents són equivalents, per recomptar el nombre d'estructures de dades diferents, per millorar l'eficiència de diversos algorismes tot eliminant càlculs repetits, o per fer possible una ordenació de les dades.

## Exemples d'ús
### Servidors web

La canonització dels noms d'arxius és important per la seguretat informàtica. Per exemple, un servidor web pot contenir una regla de seguretat que digui "executar només arxius del directori cgi (C:\inetpub\wwwroot\cgi-bin)". Aquesta regla es concreta en comprovar que la ruta comença per "C:\inetpub\wwwroot\cgi-bin\", i si és així, s'executa l'arxiu.
Amb aquesta premissa de seguretat, hom es pot plantejar la pregunta de si s'hauria d'executar l'arxiu "C:\inetpub\wwwroot\cgi-bin\..\..\..\Windows\System32\cmd.exe". Aquesta ruta puja per l'estructura de directoris (a causa de l'indicador de directoris '..'), i no roman al directori cgi-bin. Si el servidor web acceptés aquesta ruta, posaria en perill la seguretat del lloc web. Si es canonitza la representació del directori, s'obté la representació "C:\Windows\System32\cmd.exe", on ja es pot comprovar que no és una ruta acceptable. aquest tipus de debilitats en la seguretat s'anomenen directory traversal.

### Unicode

Les codificacions de longitud variable en l'estàndard Unicode, en particular UTF-8, tenen més d'una possible codificació per a la majoria de caràcters. Això fa que la validació de cadenes de caràcters sigui més complicada, perquè hom ha de considerar totes les possibles codificacions de cada cadena. Una solució de programari que no considerés totes les codificacions tindria el risc d'acceptar cadenes que, de fet, són invàlides, la qual cosa podria provocar errors o permetre atacs des de l'exterior. La solució és permetre una única codificació per a cada caràcter. La canonització és, doncs, el procés de traduir cada cadena de caràcters a la seva única codificació permesa. Una alternativa és que el programari determini si una cadena està en forma canònica, i rebutjar-la si no ho està. En aquest cas, en un context client/servidor, la canonització seria responsabilitat de la part client.

### Motors de cerca

En les cerques a internet i en optimització per a motors de cerca, la canonització dels URL té a veure amb el contingut web que pot tenir més d'un URL. El fet de tenir múltiples adreces URL pel mateix contingut web pot causar problemes als motors de cerca, sobretot a l'hora de determinar quin URL s'ha de mostrar en els resultats de la cerca.
Per exemple:
* http://wikipedia.com
* http://www.wikipedia.com
* http://www.wikipedia.com/
* http://www.wikipedia.com/?source=asdf
Tots aquests URL apunten a la pàgina inicial de Wikipedia, però un motor de cerca només considerarà un d'ells com a forma canònica de l'URL.

### XML

La canonització d'un document XML, definida per l'especificació del World Wide Web Consortium, consisteix a eliminar els espais en blanc dintre de les etiquetes, usar codificacions de caràcters determinades, ordenar les referències a espais de noms, eliminar-ne les redundants, eliminar declaracions XML i DOCTYPE, i transformar adreces URI relatives en absolutes.
Vegem un exemple; donades aquestes dues versions del mateix XML:
* "<node1>Data</node1> <node2>Dada</node2>"
* "<node1>Data</node1> <node2>Dada</node2>"
(noteu els espais en blanc) La forma canonitzada podria ser:
* "<node1>Data</node1><node2>Dada</node2>"
Noteu que s'han eliminat els espais en blanc; això forma part del procés de canonització.
A continuació es presenten alguns aspectes de la canonització d'un document XML:
* El document està codificat en UTF-8
* Els salts de línia es normalitzen a #xA, abans de seguir el procés
* Es normalitzen els valors dels atributs
* Se substitueixen les referències d'entitat
* Les seccions CDATA es substitueixen pel seu contingut caràcter
* S'eliminen la declaració XML i la declaració del tipus de document
* Els elements buits es converteixen a parells d'etiquetes inici-final
* Es normalitzen els espais en blanc fora de l'element de document i dins de les etiquetes d'inici i final
* Es mantenen els espais en blanc dins el contingut caràcter (exclosos els caràcters eliminats durant la normalització dels salts de línia)
* Els delimitadors pels valors dels atributs es canvien a cometes dobles
* Els caràcters especials dins els valors dels atributs i contingut caràcter se substitueixen per referències de caràcter
* S'eliminen de cada element les declaracions supèrflues d'espais de noms
* S'afegeixen atributs per defecte a cada element
* Es corregeixen els atributs xml:base
* S'imposa l'ordre lexicogràfic en les declaracions dels espais de noms i en els atributs de cada element

## Referències

* ↑ http://www.ietf.org/rfc/rfc2279.txt
* ↑ Cutts, Matt. «SEO advice: url canonicalization» (en anglès). Matt Cutts: Gadgets, Google, and SEO, 04-01-2006. [Consulta: 28 setembre 2013].

## Enllaços externs

* Canonical XML Version 1.0, W3C Recommendation
* OWASP Security Reference for Canonicalization