Guía
Cómo detectar y corregir una URL doblemente codificada
Reconoce patrones como %2520, identifica el límite que codificó dos veces y corrige una sola capa sin activar delimitadores ocultos.
por Tools in a Tab · Publicado el · Revisado el
Respuesta breve
%2520, %252F o %253F suelen indicar doble codificación: %25 representa
el signo %, así que una primera decodificación deja %20, %2F o %3F.
Trátalo como una señal, no como una orden de decodificar dos veces. Localiza
qué componente debía codificarse y corrige la frontera que aplicó la segunda
capa.
Cómo se produce %2520
Una codificación de componente convierte un espacio en %20. Si otra capa
recibe literalmente esos tres caracteres y vuelve a codificarlos, el % se
convierte en %25, dando %2520. El patrón general es:
espacio → %20 → %2520
El codificador URL avisa cuando la
entrada que vas a codificar ya contiene un escape %HH o cuando, tras
decodificar una capa, el resultado todavía parece codificado. La advertencia no
demuestra el error: a veces se desea transportar el texto literal %20.
Señales útiles y falsos positivos
Busca %25 seguido de dos hexadecimales, especialmente %2520, %252F,
%253A, %253F, %2526 y %253D. También compara el valor en cada límite:
navegador, proxy, framework, registro y aplicación. El primer punto donde
%20 se transforma en %2520 revela la capa duplicada.
No toda aparición de %25 es un fallo. El valor humano 50% se representa
correctamente como 50%25; y una página que enseña la cadena literal %20
necesita transportarla como %2520. Solo el contrato permite distinguir dato
literal de escape aplicado dos veces.
Decodifica por componente, no toda la dirección
Supón que un parámetro contiene una URL de retorno. La URL exterior codifica la interior como valor, por lo que ver escapes anidados es normal:
/login?next=https%3A%2F%2Fejemplo.test%2Fa%3Fx%3D1%25202
Primero analiza la URL exterior y extrae next; después decodifica exactamente
la capa definida para ese valor. Aplicar decodeURIComponent dos veces a toda
la dirección puede convertir %26 en & demasiado pronto, creando un
parámetro nuevo o cambiando la ruta.
La RFC 3986 recomienda codificar o decodificar solo una vez, salvo que un esquema concreto defina capas adicionales.
Cómo corregirlo en origen
Mantén datos crudos dentro del programa. Si una función devuelve un componente
ya codificado, no lo pases de nuevo por encodeURIComponent; mejor aún, cambia
su contrato para que devuelva el valor sin codificar y deja una sola capa
responsable del límite URL.
Para queries, usa URLSearchParams.set(nombre, valorCrudo). Para segmentos de
ruta, codifica cada valor una vez justo antes de unirlo a la ruta. No
precodifiques datos en la base de datos: diferentes consumidores pueden
necesitar HTML, JSON, URL u otro contexto.
Método seguro de reparación
- Conserva entrada y URL final exactas para reproducir el fallo.
- Separa esquema, ruta, query y fragmento con un parser.
- Identifica qué campos son datos y cuántas capas documenta el protocolo.
- Decodifica una sola capa del componente afectado.
- Si aún aparece
%HH, comprueba si representa texto literal o una capa real. - Corrige el productor y añade una prueba de ida y vuelta.
Evita una regla global que reemplace %25 por %. Podría introducir escapes
inválidos, cambiar delimitadores o permitir que una entrada controlada por el
usuario altere la estructura de la URL.
Pruebas que conviene guardar
Incluye un espacio, un porcentaje literal, &, =, /, Unicode y una URL
anidada. Comprueba tanto el valor recibido como la estructura final. Una buena
prueba no afirma solo que %2520 desaparece: demuestra que el dato original se
recupera después del número exacto y documentado de capas.