Blog do ClockTools

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 , desenvolvedor e editor | | Revisado conforme a política editorial do ClockTools

Ilustração de destaque do ClockTools sobre a codificação de espaços em URLs
Í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.

Diagrama de decisão que indica %20 para espaços em componentes de URI e o sinal de mais para a serialização de formulários
Diagrama de decisão que indica %20 para espaços em componentes de URI e o sinal de mais para a serialização de formulários

Tabela de decisão: %20 ou sinal de mais

DestinoRepresentação do espaçoExemplo para green teaPor que
Segmento de caminho%20/topics/green%20teaO espaço faz parte dos dados de um segmento de caminho
Valor de consulta codificado como um componente%20?q=green%20teaA codificação do componente mantém o valor separado dos delimitadores
Consulta ou corpo da requisição no formato form-urlencoded+q=green+teaO 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 serializadohttps://example.com/green%20tea?q=hot%20cupOs caracteres estruturais :, /, ?, = e & continuam sendo delimitadores
Sinal de mais literal nos dados do formulário%2Bq=C%2B%2BUm 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.

EntradaPerfilSaída observadaInterpretação
green teaComponente URIgreen%20teaUm componente, espaço com codificação percentual
green teaDados do formuláriogreen+teaConvenção de representação de espaços em formulários
C++Dados do formulárioC%2B%2BSinais de mais literais são protegidos
https://example.com/a b?q=x yURL completahttps://example.com/a%20b?q=x%20yOs 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 -> %20

Codifique %20 como um novo componente. O sinal de porcentagem vira %25, enquanto os dígitos permanecem literais:

%20 -> %2520

Uma 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.

  1. Capture o valor bruto antes que qualquer analisador do framework o altere.
  2. Identifique se o campo é um segmento de caminho, um componente de consulta, uma URL completa ou um corpo de formulário.
  3. Registre o valor decodificado esperado, incluindo sinais de adição literais.
  4. Reproduza a mesma entrada no perfil ClockTools correspondente.
  5. Decodifique uma vez com o perfil de recebimento.
  6. Compare o resultado com o valor esperado.
  7. Procure um segundo codificador ou decodificador no fluxo da aplicação se %25 aparecer inesperadamente.
SintomaPrimeira verificaçãoCausa provável
green+tea continua com um sinal de maisPerfil do decodificadorO decodificador de componentes não converte o sinal de mais em espaço
C++ torna-se C Codificação do remetenteSinais de adição literais não foram codificados como %2B
%20 é visível para o usuárioNúmero de decodificaçõesOs dados codificados nunca foram decodificados ou foram codificados duas vezes anteriormente
%2520 aparece em uma requisiçãoNúmero de codificaçõesO sinal de porcentagem de %20 foi codificado novamente
A consulta se divide após um e comercialLimite do componenteUm 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.

Sobre o autor

Vigneshwaran Vijayakumar

Fundador, desenvolvedor e editor do ClockTools | Gerente de marketing digital | Índia

Vigneshwaran é engenheiro e tem décadas de experiência técnica, incluindo atuação profissional como gerente de marketing digital em Dubai. Seu trabalho reúne análise de dados, otimização para mecanismos de busca, otimização da taxa de conversão, sistemas de conteúdo, produção visual, IA aplicada e aprendizado de máquina. No ClockTools, ele transforma essa experiência multidisciplinar em ferramentas de navegador voltadas a tarefas específicas e guias práticos fundamentados em fontes.

Perfil do LinkedIn