Web y codificación · 5 minutos de lectura
Codificación URL: cuándo escapar y cuándo estás rompiendo
Las URL se ensamblan a partir de caracteres que significan algo para el analizador y caracteres que son simplemente datos, y la codificación porcentual es la forma en que se mantienen separados. Un codificador URL convierte estos últimos en `%XX` escapes, de modo que un valor que contenga `&`, `?` o un espacio sobreviva al viaje. La mayoría de los errores URL no son fallas de codificación en absoluto: codifican la parte incorrecta o codifican dos veces.
Actualizado
¿Qué debe codificarse?
Un pequeño conjunto de caracteres siempre es seguro: letras, dígitos, `-`, `_`, `.` y `~`. Todo lo demás está reservado o se debe evitar. Los caracteres reservados son los interesantes, porque son legales en una URL pero solo en posiciones específicas: `?` inicia una consulta, `&` separa parámetros, `=` asigna un valor, `#` inicia un fragmento, `/` separa segmentos de ruta. Coloque uno de ellos dentro de un valor sin codificar y habrá reescrito silenciosamente la estructura de la URL.
Más o %20
El espacio es el ejemplo clásico. En un camino, un espacio debe ser `%20`; un `+` hay un plus literal. En cuerpos `application/x-www-form-urlencoded` y cadenas de consulta leídas por analizadores de formularios, `+` se entiende como un espacio. Esa divergencia es la razón por la cual un valor puede codificar algo que funciona en un contexto y no funciona en otro, y por qué los decodificadores ofrecen ambas interpretaciones.
Codifique componentes, no URL completas. Al ejecutar un URL completo a través de un codificador de componentes, se escapan sus propios `://` y `?`, lo que produce un enlace que no se resuelve en nada.
La distinción de JavaScript que atrapa a todos
encodeURI('https://x.com/a b?q=1') // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1') // escapes ? and = — for one value
`encodeURI` conserva la estructura URL y está destinado a una dirección completa; `encodeURIComponent` escapa a todo lo significativo y está destinado a un valor de parámetro único. Usar el incorrecto produce un URL roto o un valor sin escape, y los síntomas son opuestos: un enlace 404 o una cadena de consulta que pierde la mitad de sus parámetros.
Doble codificación y URL firmadas
Codificar un valor ya codificado convierte `%20` en `%2520`, y luego el servidor lo decodifica una vez y le entrega a su aplicación un `%20` literal donde estaba previsto un espacio. Esto aparece en sistemas en capas: un proxy que vuelve a codificar un objetivo, un cliente que escapa de un URL que recibió y que ya se escapó. Es más importante para las URL firmadas: las firmas se calculan sobre la cadena codificada exacta, por lo que cambiar el escape de un carácter invalida el enlace aunque todavía se resuelva en el mismo recurso.
Decodificar para depurar
Cuando un enlace falla, decodificarlo es la forma más rápida de ver qué se le solicita realmente al servidor, y la respuesta suele ser un valor que se filtró en la estructura. Trabajar en el navegador significa que puede pegar un URL que contiene tokens, parámetros firmados o identificadores de cliente sin enviarlo a ninguna parte, que es precisamente el tipo de URL que no debe pegar en un servicio que registra solicitudes.
URL Codificador / Decodificador — preguntas frecuentes
¿Un espacio debería ser %20 o un signo más?
Utilice `%20` en caminos y en cualquier URL que construya usted mismo; ambos son válidos en cadenas de consulta, donde los analizadores de formularios convencionalmente leen `+` como un espacio. La decodificación necesita saber qué convención produjo la cadena.
¿Por qué codificar mi URL dos veces lo rompe?
Cada paso escapa del carácter de escape: un espacio se convierte en `%20`, luego `%2520`. Al llegar, el servidor decodifica una vez y su aplicación recibe texto literal `%20`. Codifique una vez, en el punto donde un valor sin procesar se convierte en parte de URL.
¿Cuál es la diferencia entre encodeURI y encodeURIComponent?
`encodeURI` deja caracteres estructurales como `://`, `?`, `&` y `=` intactos, por lo que se adapta a una dirección completa. `encodeURIComponent` también los escapa, por lo que se adapta a un valor de parámetro único. Mezclarlos es la causa de la mayoría de los enlaces generados rotos.
Herramientas mencionadas en esta publicación.
Más artículos para leer
5 minutos de lectura
Base64 decodificar y codificar: para transporte, no para
Base64 decodifica y codifica en el navegador: la regla de tamaño 4/3, el relleno, la variante base64url y el error Unicode que hace que el texto decodificado parezca basura.
5 minutos de lectura
cURL para recuperar: mover una solicitud del terminal al
cURL para recuperar la conversión para JavaScript: encabezados, cuerpos, autenticación y métodos asignados correctamente, además de la realidad CORS que decide si una solicitud funciona.
6 minutos de lectura
Decodificador JWT: qué hay dentro de un token y qué no
Utilice un decodificador JWT para inspeccionar el encabezado, la carga útil y el vencimiento de un token, y comprenda por qué la decodificación no es una verificación, ya que las verificaciones de reclamos están detrás de la mayoría de los 401.