Ferramentas de URL
Codificação de espaços em URLs: %20 ou sinal de mais?
Um espaço em uma URL vira %20 em um componente de URI e + apenas na serialização de formulários.
Por Vigneshwaran Vijayakumar, desenvolvedor e editor | | Revisado conforme a política editorial do ClockTools
Índice
Um espaço nos dados de uma URL geralmente vira %20, mas a serialização de consultas no formato de formulário o representa como +. As duas formas podem estar corretas. A saída adequada depende do destino: use a codificação percentual para um componente individual de URI e a convenção do sinal de mais apenas quando o fluxo de recebimento esperar dados application/x-www-form-urlencoded.
O codificador de URL do ClockTools explicita esse contexto com os perfis Componente URI, URL completa e Dados do formulário. Cole green tea, alterne entre os perfis e compare a saída antes de mudar o código da aplicação.
Comece com o destino
Não pergunte “Qual símbolo sempre significa espaço?” Pergunte qual analisador receberá o valor.
Para um segmento de caminho, valor de fragmento ou valor individual de consulta, a codificação percentual é uma representação confiável. O byte UTF-8 do caractere de espaço é o hexadecimal 20, portanto sua sequência de três caracteres na codificação percentual é %20.
Para dados no formato de formulário HTML, a convenção de serialização usa + para espaços e codifica um sinal de mais literal como %2B. O padrão de URL da WHATWG define esse comportamento de form-urlencoded separadamente da análise geral de URLs.
A sintaxe de URI da RFC 3986 define um octeto com codificação percentual como % seguido de dois dígitos hexadecimais. Também distingue os delimitadores reservados dos caracteres de dados não reservados. Essa distinção explica por que codificar um valor é diferente de codificar um endereço inteiro.
Tabela de decisão: %20 ou sinal de mais
| Destino | Representação do espaço | Exemplo para green tea | Por que |
|---|---|---|---|
| Segmento de caminho | %20 | /topics/green%20tea | O espaço faz parte dos dados de um segmento de caminho |
| Valor de consulta codificado como um componente | %20 | ?q=green%20tea | A codificação do componente mantém o valor separado dos delimitadores |
| Consulta ou corpo da requisição no formato form-urlencoded | + | q=green+tea | O serializador de formulários converte o espaço em sinal de mais |
| Exibição de URL completa | %20 onde um espaço literal precisa ser serializado | https://example.com/green%20tea?q=hot%20cup | Os caracteres estruturais :, /, ?, = e & continuam sendo delimitadores |
| Sinal de mais literal nos dados do formulário | %2B | q=C%2B%2B | Um sinal de mais sem codificação seria decodificado como espaço nesse perfil |
A última linha evita um erro comum. Se o valor pretendido for C++, enviar C++ por um decodificador de formulários pode produzir C . Codifique cada sinal de mais literal como %2B antes de analisar o formulário.
Quatro testes reproduzíveis no ClockTools
Testamos quatro entradas curtas na implementação atual da ferramenta. O perfil Componente URI usa a função JavaScript encodeURIComponent. Dados do formulário aplica a mesma codificação de componente e depois substitui %20 por +. URL completa usa encodeURI, que preserva a estrutura da URL.
| Entrada | Perfil | Saída observada | Interpretação |
|---|---|---|---|
green tea | Componente URI | green%20tea | Um componente, espaço com codificação percentual |
green tea | Dados do formulário | green+tea | Convenção de representação de espaços em formulários |
C++ | Dados do formulário | C%2B%2B | Sinais de mais literais são protegidos |
https://example.com/a b?q=x y | URL completa | https://example.com/a%20b?q=x%20y | Os delimitadores de URL permanecem estruturais |
Esses resultados são transformações determinísticas, não evidências de posicionamento nos resultados de busca. Você pode reproduzi-los localmente no navegador. A página atualiza a saída imediatamente, informa as sequências de escape percentuais e a contagem de bytes e não precisa enviar a entrada a um servidor para fazer a conversão.
Use o decodificador de URL para fazer a verificação inversa. Decodifique green%20tea no perfil de componente e green+tea em Dados do formulário. O decodificador avisa quando um sinal de mais aparece em um perfil que não é de formulário, pois o significado pretendido é ambíguo.
O que a codificação de componentes protege?
Uma URL usa a pontuação como gramática. Em uma string de consulta, & pode iniciar outro parâmetro e = separa um nome de um valor. # inicia um fragmento. ? inicia uma consulta. Se um desses caracteres fizer parte dos dados do usuário, deixá-lo sem codificação pode alterar a estrutura.
Considere o valor timer & alarm. A codificação de componente produz timer%20%26%20alarm. O e comercial vira %26, de modo que o analisador recebe um único valor em vez de interpretar alarm como um novo parâmetro.
Codificar é representar, não validar nem criptografar. Um redirecionamento com codificação percentual ainda pode apontar para um host não aprovado após a decodificação. Um script codificado continua sendo uma entrada não confiável. Valide os esquemas permitidos, hosts, nomes de parâmetros e regras de negócio após a análise. Evite colocar senhas, tokens ou outros segredos em URLs, pois os endereços podem aparecer no histórico, em logs, dados de análise, capturas de tela e dados de referência.
Quando precisar comparar uma string de consulta antes e depois de uma alteração, o comparador de texto torna visível cada sequência de escape alterada. Isso é mais confiável do que procurar um %25 ausente em uma longa URL de callback.
Por que a codificação dupla cria %2520?
A codificação dupla acontece quando o texto já codificado é tratado como dados brutos e codificado novamente.
Comece com um espaço:
space -> %20Codifique %20 como um novo componente. O sinal de porcentagem vira %25, enquanto os dígitos permanecem literais:
%20 -> %2520Uma decodificação converte %2520 de volta em %20. Uma segunda decodificação converte %20 em espaço. Se a aplicação espera uma única etapa de decodificação, mas recebe um valor codificado duas vezes, o usuário pode ver %20 em vez de um espaço em branco.
A solução não é decodificar repetidamente até o texto parecer correto. A decodificação repetida pode alterar delimitadores codificados deliberadamente e criar problemas de segurança. Defina a responsabilidade de cada camada: exatamente uma deve codificar o componente, e exatamente uma camada correspondente deve decodificá-lo.
Roteiro para depurar divergências na representação de espaços
Use este roteiro quando um sistema enviar %20 e outro exibir +, %2520 ou um espaço em branco literal.
- Capture o valor bruto antes que qualquer analisador do framework o altere.
- Identifique se o campo é um segmento de caminho, um componente de consulta, uma URL completa ou um corpo de formulário.
- Registre o valor decodificado esperado, incluindo sinais de adição literais.
- Reproduza a mesma entrada no perfil ClockTools correspondente.
- Decodifique uma vez com o perfil de recebimento.
- Compare o resultado com o valor esperado.
- Procure um segundo codificador ou decodificador no fluxo da aplicação se
%25aparecer inesperadamente.
| Sintoma | Primeira verificação | Causa provável |
|---|---|---|
green+tea continua com um sinal de mais | Perfil do decodificador | O decodificador de componentes não converte o sinal de mais em espaço |
C++ torna-se C | Codificação do remetente | Sinais de adição literais não foram codificados como %2B |
%20 é visível para o usuário | Número de decodificações | Os dados codificados nunca foram decodificados ou foram codificados duas vezes anteriormente |
%2520 aparece em uma requisição | Número de codificações | O sinal de porcentagem de %20 foi codificado novamente |
| A consulta se divide após um e comercial | Limite do componente | Um e comercial presente nos dados foi deixado sem codificação |
Este roteiro de depuração tem um escopo deliberadamente restrito. Ele separa o contexto dos dados das suposições, e cada etapa tem entrada e saída visíveis.
Quando você deve codificar uma URL completa?
Use o perfil URL completa apenas quando quiser que o endereço continue sendo um endereço. Ele preserva a pontuação estrutural, como os dois-pontos após o esquema, as barras, o ponto de interrogação, o sinal de igual, o e comercial e o marcador de fragmento, enquanto codifica caracteres como espaços.
Use Componente URI quando uma URL completa estiver dentro de outro parâmetro. Por exemplo, um endereço de callback colocado em redirect= é um dado do ponto de vista da URL externa. Codificar o endereço interno como um único componente impede que seus caracteres ? e & passem a fazer parte da consulta externa.
Não passe repetidamente um endereço por perfis diferentes esperando uma string universalmente segura. Escreva o limite explicitamente:
outer URL structure + encodeURIComponent(inner callback URL)A aplicação que recebe os dados deve analisar a URL externa, extrair o componente de callback, decodificá-lo uma vez, analisar a URL interna resultante e validar o destino. A codificação mantém a sintaxe intacta; a validação determina se o destino é permitido.
Perguntas frequentes
Um espaço em uma URL deve ser %20 ou um sinal de mais?
Use %20 para um espaço dentro de um componente URI geral. Use + quando o fluxo de trabalho de recebimento espera explicitamente a serialização application/x-www-form-urlencoded.
Por que um sinal de mais é decodificado como um espaço?
Os analisadores de formulários convertem + em espaço como parte da convenção form-urlencoded. Um decodificador de componentes em geral não precisa aplicar essa substituição.
Como codifico um sinal de adição literal nos dados do formulário?
Codifique o sinal de mais como %2B. Caso contrário, um decodificador de formulários pode interpretar o sinal de mais sem codificação como um espaço.
O que significa %2520?
%2520 geralmente indica codificação dupla. O sinal de porcentagem em um escape %20 existente tornou-se %25, portanto, uma decodificação retorna %20 e uma segunda decodificação retorna um espaço.
Devo codificar uma URL inteira com encodeURIComponent?
Não quando o esquema, as barras, os delimitadores de consulta e o marcador de fragmento devem manter sua função estrutural. Use a codificação de componente quando toda a URL estiver inserida como dado em outro valor.
A codificação de URL torna segura a entrada não confiável?
Não. A codificação preserva os limites da sintaxe, mas o receptor ainda deve validar esquemas, hosts, redirecionamentos, valores de parâmetros, permissões e outras regras de negócios após a análise.

