Una URL (localizador uniforme de recursos) es una dirección con hasta siete partes. Lo que sigue a ? es la cadena de consulta, una lista de pares clave=valor que pasa pequeñas cantidades de datos al servidor. Como unos pocos caracteres tienen significado especial dentro de una URL, cualquier dato que los contenga debe codificarse en porcentaje.
Anatomía de una URL
Tomemos esta dirección:
https://[email protected]:8443/shop/shoes?q=red+shoes&size=9&tag=a&tag=b#reviews
| Parte | Valor | Notas |
|---|---|---|
| Esquema | https |
Qué protocolo usar |
| Información de usuario | user |
Poco común y mejor evitarla |
| Host | www.example.com |
Qué servidor; no distingue mayúsculas |
| Puerto | 8443 |
Por defecto: 80 para HTTP, 443 para HTTPS |
| Ruta | /shop/shoes |
Qué recurso del servidor |
| Consulta | q=red+shoes&size=9&tag=a&tag=b |
Parámetros, tras ? |
| Fragmento | reviews |
Un punto dentro de la página; nunca se envía al servidor |
Pega cualquier dirección en el analizador de URL para ver estas partes y cada parámetro de consulta por separado.
Codificación porcentual
Los caracteres reservados tienen funciones en una URL: ? inicia la consulta, & separa pares, = separa clave y valor, # inicia el fragmento, / separa segmentos de ruta. Para usar uno como dato normal, escribe % seguido de su valor en bytes en hexadecimal. Los caracteres fuera de ASCII se convierten primero en bytes UTF-8 y se codifica cada byte.
| Carácter | Codificado |
|---|---|
| espacio | %20 (o + en consultas de formulario) |
# |
%23 |
& |
%26 |
= |
%3D |
? |
%3F |
/ |
%2F |
% |
%25 |
é |
%C3%A9 |
€ |
%E2%82%AC |
Codifica y decodifica texto con el codificador de URL y el decodificador de URL. Ten en cuenta que % debe codificarse como %25, por lo que decodificar dos veces estropea los valores.
Cadenas de consulta
Los pares se separan con &. La misma clave puede repetirse y los receptores deciden cómo leerla. Al analizar la consulta anterior se obtiene:
| Clave | Valores |
|---|---|
q |
red shoes |
size |
9 |
tag |
a, b (la clave aparece dos veces) |
Para construir una consulta bien codificada, introduce los pares en el constructor de cadenas de consulta. Por ejemplo, los valores red shoes & boots y 10-20 se convierten en q=red+shoes+%26+boots&price=10-20. Las etiquetas de campaña son una aplicación de la misma idea: consulta Cómo crear enlaces UTM para el seguimiento de campañas.
Nombres de dominio internacionales
Los nombres de host viajan en ASCII. Un nombre con letras acentuadas o no latinas se convierte a punycode y se prefija con xn--: münchen.de pasa a ser xn--mnchen-3ya.de. Las letras parecidas de otros alfabetos hacen que el mismo mecanismo sea un favorito de los estafadores, así que convierte los hosts sospechosos con el conversor de nombre de host a Punycode.
Errores comunes
- Olvidar codificar un valor. Un
&o#sin escapar en un valor lo corta en silencio. - Doble codificación. Codificar una cadena ya codificada convierte
%20en%2520. - Poner secretos en la URL. Las cadenas de consulta acaban en registros, historial y cabeceras de referencia.
- Suponer un valor por clave. Lee las claves repetidas como listas.
- Fiarse de la parte visible de un enlace. Consulta Cómo analizar un enlace sospechoso con seguridad.