Por qué las URL necesitan codificación
Una URL es a la vez una dirección legible y una cadena estructurada que analizan navegadores, proxies y servidores. Ciertos caracteres separan componentes: ? inicia la consulta, & separa parámetros, # comienza el fragmento, / divide segmentos de ruta, y los espacios resultan incómodos en muchos contextos. Si el valor de un parámetro contiene & o =, el analizador malinterpretaría la estructura a menos que esos bytes se escriban de forma segura.
La codificación URL—más formalmente percent-encoding—sustituye bytes inseguros o reservados por un % seguido de dos dígitos hexadecimales. El byte space suele convertirse en %20 (o en + en la variante application/x-www-form-urlencoded). No es cifrado; es una ortografía de transporte para que estructura y carga puedan coexistir.
Pruebe a codificar una frase con la herramienta de texto a URL codificada.
Caracteres reservados frente a no reservados
RFC 3986 define caracteres unreserved que suelen aparecer tal cual: letras, dígitos y -._~. Los caracteres reserved como :/?#[]@!$&'()*+,;= tienen roles en la gramática de URL. Si debe codificar un carácter reservado depende de dónde aparezca. Una / en la ruta es un separador; una / dentro de los datos de un solo segmento puede necesitar codificación si quiere una barra literal en el valor de ese segmento.
Regla práctica: codifique los datos que inyecta en un componente para que los caracteres reservados pierdan su significado especial para el analizador circundante.
Mecánica de percent-encoding
- Exprese la cadena como bytes (casi siempre UTF-8 en la web moderna).
- Por cada byte que deba codificarse, escriba
%más hex en mayúsculas o minúsculas (los decodificadores aceptan ambos; los emisores suelen usar mayúsculas). - Deje los caracteres seguros sin cambios.
Ejemplo: el espacio en hello world se convierte en hello%20world. La codificación UTF-8 de é son los bytes C3 A9, así que el carácter se convierte en %C3%A9.
La decodificación invierte el mapeo. Secuencias incompletas como %Z o un % final deben rechazarse o tratarse según las reglas de su plataforma—no adivine en silencio en código sensible a la seguridad.
Cadenas de consulta y application/x-www-form-urlencoded
Los formularios HTML codifican tradicionalmente los espacios como + y usan & / = como delimitadores. Las bibliotecas llamadas encodeURIComponent frente a URLSearchParams difieren en casos límite. Al depurar:
- Confirme si
+significa espacio o un más literal. - Codifique los valores antes de unirlos con
&. - No codifique toda la URL a ciegas—el esquema y el host tienen reglas distintas.
encodeURI y encodeURIComponent en JavaScript codifican conjuntos de caracteres distintos; elegir el incorrecto es una fuente frecuente de enlaces rotos.
Rutas, matrices y fragmentos
Los segmentos de ruta deben codificar espacios y la mayoría de caracteres reservados que no se pretendan como separadores.
Los fragmentos (#...) los gestiona el cliente y no se envían al servidor en la petición HTTP; la codificación sigue importando para la corrección en el cliente.
El userinfo (user:pass@) está obsoleto para secretos en URL—evite poner credenciales en URL independientemente de la codificación.
Doble codificación y errores de decodificación
La doble codificación ocurre cuando %20 se codifica de nuevo en %2520. Los síntomas incluyen %20 literal en la UI o archivos no encontrados porque el servidor busca el nombre equivocado. La subcodificación deja & dentro de un valor y trunca los parámetros siguientes.
Una canalización robusta codifica exactamente una vez en el límite donde una cadena en bruto pasa a ser parte de un componente de URL, y decodifica una vez al extraer valores.
Nombres de dominio internacionalizados y rutas
Los hosts usan IDNA (Punycode) para etiquetas de dominio no ASCII—un mecanismo distinto del percent-encoding de datos de ruta y consulta. Rutas y consultas usan percent-encoding UTF-8. Mezclar codificaciones heredadas (Latin-1 asumido en un lado, UTF-8 en el otro) produce mojibake tras decodificar.
Documente siempre UTF-8 como codificación de bytes en APIs nuevas.
Aspectos de seguridad
La codificación URL no sustituye el escape HTML, la parametrización SQL ni la seguridad de argumentos de comando. Una cadena correctamente percent-codificada para un parámetro de consulta puede seguir siendo peligrosa si luego se coloca en HTML sin escape, o en un shell sin comillas adecuadas.
Los problemas de open-redirect y SSRF suelen involucrar URL como datos. Valide esquemas y hosts tras decodificar—los atacantes pueden codificar puntos, barras o credenciales para confundir filtros ingenuos. Compare formas decodificadas con cuidado; mejor aún, analice con una biblioteca URL estándar y permita propiedades con lista blanca.
Registro y privacidad
Las cadenas de consulta contienen a menudo términos de búsqueda, tokens o datos personales. La codificación no los oculta de los registros del servidor ni del historial del navegador. Prefiera cuerpos POST o cabeceras para valores sensibles, y elimine secretos de los registros de acceso.
Lista de comprobación de pruebas
- Codifique una cadena con espacios,
&,=y caracteres no ASCII. - Decodifique y compare con los puntos de código originales.
- Coloque el valor codificado en una consulta real y léalo de nuevo desde la API de parámetros de su framework.
- Compruebe que su framework no doble-decodifica.
- Verifique que el comportamiento de
+frente a%20coincida con el tipo de medio que usa.
La herramienta de codificación URL ayuda con los pasos 1–2 en la exploración manual.
Escenarios habituales
Construir enlaces de búsqueda. Codifique el valor de la consulta del usuario; no codifique ?q= en sí.
URI de redirección OAuth. Puede exigirse coincidencia exacta de cadena; las diferencias de codificación rompen redirecciones.
Claves de object storage en URL. Codifique segmentos de ruta para que funcionen claves anidadas con espacios.
CSV de enlaces. Vigile que el software de hojas de cálculo no reinterprete secuencias %.
Codificaciones relacionadas
No confunda percent-encoding con Base64 ni con entidades HTML. Base64 usa otro alfabeto y sirve para bytes arbitrarios en contextos de texto; las entidades HTML protegen la estructura del documento en el marcado. Use el codificador que coincida con el analizador receptor.
Resumen
La codificación URL permite que texto arbitrario viaje dentro de componentes de URL sin romper delimitadores. Convierta a bytes UTF-8, percent-codifique valores inseguros una vez y decodifique una vez a la salida. Elija APIs con cuidado para consulta frente a URI completa, valide URL tras el análisis por seguridad, y recuerde: la codificación es ortografía—no confidencialidad.