Herramientas de URL
Codificación de URL para espacios: %20 o Plus?
Un espacio de URL se convierte en %20 en un componente de URI y + solo en la serialización de estilo de formulario.
Por Vigneshwaran Vijayakumar, desarrollador y editor | | Revisado bajo el ClockTools política editorial
Tabla de contenidos
Un espacio en los datos de la URL generalmente se convierte en %20, pero la serialización de consultas de estilo formulario lo representa como +. Ambos pueden ser correctos. La salida correcta depende del destino: use codificación porcentual para un componente URI individual y use la convención plus solo cuando el flujo de trabajo receptor lo espere. aplicación/x-www-formulario-urlencoded datos.
el ClockTools Codificador de URL hace que ese contexto sea explícito con los perfiles de componente URI, URL completa y datos de formulario. Pegar té verde, cambie perfiles y compare el resultado antes de cambiar el código de la aplicación.
Comience con el destino
No preguntes "¿Qué símbolo siempre significa espacio?" Pregunte qué analizador recibirá el valor.
Para un segmento de ruta, valor de fragmento o valor de consulta individual, la codificación porcentual es la representación confiable. El byte UTF-8 del carácter de espacio es hexadecimal. 20, por lo que su triplete codificado por ciento es %20.
Para datos de estilo de formulario HTML, la convención de serialización utiliza + para espacios y porcentaje: codifica un plus literal como %2 mil millones. el Estándar de URL WHATWG define este comportamiento codificado en URL por separado del análisis de URL general.
el RFC 3986 Sintaxis de URI define un octeto codificado por ciento como % seguido de dos dígitos hexadecimales. También distingue los delimitadores reservados de los caracteres de datos no reservados. Esa distinción es la razón por la que codificar un valor es diferente de codificar una dirección completa.
La tabla de decisión %20 versus plus
| Destino | Representación espacial | Ejemplo para té verde | ¿Por qué? |
|---|---|---|---|
| Segmento de ruta | %20 | /topics/verde%20té | El espacio son datos dentro de un segmento de ruta. |
| Valor de consulta codificado como un componente | %20 | ?q=té%20verde | La codificación de componentes mantiene el valor separado de los delimitadores. |
| Consulta con formulario codificado en URL o cuerpo de solicitud | + | q=té+verde | El serializador de formularios asigna espacio a más |
| Visualización completa de URL | %20 donde se debe serializar un espacio literal | https://example.com/green%20tea?q=hot%20cup | estructural :, /, ?, =, y & siguen siendo delimitadores |
| Datos literales más internos del formulario. | %2 mil millones | q=C%2B%2B | Un simple plus se decodificaría como un espacio en ese perfil. |
La última fila previene un error común. Si el valor previsto es C++, enviando C++ a través de un decodificador de formularios puede producir c . Codifique cada literal más como %2 mil millones antes del análisis del formulario.
Cuatro pruebas ClockTools reproducibles
Ejecutamos cuatro pequeñas aportaciones a través de la implementación actual de la herramienta. Su perfil de componente URI utiliza JavaScript codificarURIComponente. Form Data aplica la misma codificación de componente y luego reemplaza %20 con +. Usos completos de la URL codificarURI, que conserva la estructura de la URL.
| Entrada | Perfil | Salida observada | Interpretación |
|---|---|---|---|
té verde | Componente URI | verde%20té | Un componente, espacio codificado por porcentaje |
té verde | Datos del formulario | te+verde | Convención espacial de estilo de forma |
C++ | Datos del formulario | C%2B%2B | Los signos más literales están protegidos |
https://example.com/a b?q=x y | URL completa | https://example.com/a%20b?q=x%20y | Los delimitadores de URL siguen siendo estructurales |
Estos son resultados de transformación deterministas, no evidencia de clasificación de búsqueda. Puedes reproducirlos localmente en el navegador. La página actualiza la salida inmediatamente, informa el porcentaje de escapes y el recuento de bytes, y no necesita enviar la entrada a un servidor para la conversión.
Utilice el Decodificador de URL para ejecutar la verificación inversa. decodificar verde%20té bajo el perfil del componente y te+verde en Datos del formulario. El decodificador advierte cuando aparece un signo más debajo de un perfil sin formulario porque el significado deseado es ambiguo.
¿Qué protege la codificación de componentes?
Una URL utiliza puntuación como gramática. En una cadena de consulta, & puede comenzar otro parámetro y = separa un nombre de un valor. # Comienza un fragmento. ? comienza una consulta. Si uno de esos caracteres pertenece a los datos del usuario, dejarlo sin editar puede cambiar la estructura.
Considere el valor temporizador y alarma. La codificación de componentes produce temporizador%20%26%20alarma. El signo comercial se convierte %26, por lo que un analizador recibe un valor en lugar de interpretar alarma como un nuevo parámetro.
La codificación es representación, no validación ni cifrado. Una redirección codificada por porcentaje aún puede apuntar a un host no aprobado después de la decodificación. Un script codificado sigue siendo una entrada que no es de confianza. Valide los esquemas, hosts, nombres de parámetros y reglas comerciales permitidos después del análisis. Evite poner contraseñas, tokens u otros secretos en las URL porque las direcciones pueden aparecer en el historial, registros, análisis, capturas de pantalla y datos de referencia.
Cuando necesita comparar una cadena de consulta de antes y después, el Comprobador de diferencias de texto hace visible cada escape modificado. Esto es más confiable que escanear una URL de devolución de llamada larga en busca de una que falte. %25.
¿Por qué la doble codificación crea %2520?
La doble codificación ocurre cuando el texto ya codificado se trata como datos sin procesar y se codifica nuevamente.
Comience con un espacio:
```texto
espacio -> %20
```
codificar %20 como un nuevo componente. El signo de porcentaje se convierte en %25, mientras que los dígitos siguen siendo literales:
```texto
%20 -> %2520
```
Una decodificación cambia %2520 volver a %20. Una segunda decodificación cambia. %20 a un espacio. Si su aplicación espera una pasada de decodificación pero recibe un valor con doble codificación, el usuario puede ver %20 en lugar de un espacio en blanco.
La solución es no decodificar repetidamente hasta que el texto se vea bien. La decodificación repetida puede cambiar los delimitadores codificados deliberadamente y crear problemas de seguridad. Identifique el límite de propiedad: exactamente una capa debe codificar el componente y exactamente una capa correspondiente debe decodificarlo.
Una ruta de depuración de discrepancias espaciales
Utilice esta ruta cuando un sistema envíe %20 y otro muestra +, %2520, o un espacio en blanco literal.
1. Capture el valor bruto antes de que cualquier analizador de marco lo cambie.
2. Identifique si el campo es un segmento de ruta, un componente de consulta, una URL completa o un cuerpo de formulario.
3. Registre el valor decodificado esperado, incluidos los signos más literales.
4. Reproduzca la misma entrada en el perfil ClockTools correspondiente.
5. Decodifica una vez con el perfil receptor.
6. Compare el resultado con el valor esperado.
7. Busque en el flujo de la aplicación un segundo codificador o decodificador si %25 aparece inesperadamente.
| Síntoma | primer cheque | causa probable |
|---|---|---|
te+verde se queda con un plus | Perfil de decodificador | El decodificador de componentes no asigna más al espacio |
C++ se convierte c | Codificación del remitente | Los signos más literales no se codificaron como %2 mil millones |
%20 es visible para el usuario | Recuento de decodificación | Los datos codificados nunca se decodificaron o se codificaron dos veces antes |
%2520 aparece en una solicitud | Recuento de codificación | Signo de porcentaje de %20 fue codificado de nuevo |
| La consulta se divide después de un signo comercial | Límite del componente | Un signo de datos quedó sin formato |
Esta ruta de depuración es intencionalmente estrecha. Separa el contexto de los datos de las conjeturas y cada paso tiene una entrada y una salida visibles.
¿Cuándo debería codificar una URL completa?
Utilice el perfil de URL completa solo cuando desee que la dirección siga siendo una dirección. Conserva la puntuación estructural, como los dos puntos del esquema, las barras diagonales, el signo de interrogación, el signo igual, el signo comercial y el marcador de fragmento, mientras codifica caracteres como los espacios.
Utilice el componente URI cuando una URL completa esté anidada dentro de otro parámetro. Por ejemplo, una dirección de devolución de llamada colocada en redireccionar = son datos desde la perspectiva de la URL externa. Codificar la dirección anidada como un componente evita su ? y & de unirse a la consulta externa.
No pase repetidamente una dirección a través de diferentes perfiles con la esperanza de obtener una cadena universalmente segura. Escribe el límite explícitamente:
```texto
estructura de URL externa + encodeURIComponent (URL de devolución de llamada interna)
```
La aplicación receptora debe analizar la URL externa, extraer el componente de devolución de llamada, decodificarlo una vez, analizar la URL interna resultante y validar el destino. La codificación mantiene la sintaxis intacta; La validación decide si el destino está permitido.
Preguntas frecuentes
¿Un espacio de URL debería ser %20 o un signo más?
Utilice %20 para un espacio dentro de un componente URI general. Utilice + cuando el flujo de trabajo de recepción espere explícitamente la serialización de application/x-www-form-urlencoded.
¿Por qué un signo más se decodifica como un espacio?
Los analizadores de estilo de formulario asignan + a un espacio como parte de la convención codificada en URL de formulario. Un decodificador de componentes generales no tiene por qué aplicar esa sustitución.
¿Cómo codifico un signo más literal en los datos del formulario?
Codifique el plus como %2B. De lo contrario, un decodificador de formularios puede interpretar el signo más como un espacio.
¿Qué significa %2520?
%2520 normalmente indica doble codificación. El signo de porcentaje en un escape %20 existente se convirtió en %25, por lo que una decodificación devuelve %20 y una segunda decodificación devuelve un espacio.
¿Debo codificar una URL completa con encodeURIComponent?
No cuando su esquema, barras diagonales, delimitadores de consultas y marcadores de fragmentos deberían seguir siendo estructurales. Utilice la codificación de componentes cuando toda la URL esté anidada como datos dentro de otro valor.
¿La codificación de URL hace que las entradas que no son de confianza sean seguras?
No. La codificación preserva los límites de la sintaxis, pero el receptor aún debe validar esquemas, hosts, redirecciones, valores de parámetros, permisos y otras reglas comerciales después del análisis.

