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

  1. Conserva entrada y URL final exactas para reproducir el fallo.
  2. Separa esquema, ruta, query y fragmento con un parser.
  3. Identifica qué campos son datos y cuántas capas documenta el protocolo.
  4. Decodifica una sola capa del componente afectado.
  5. Si aún aparece %HH, comprueba si representa texto literal o una capa real.
  6. 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.