YamlBox

Web e codificação · 5 min de leitura

URL codificação: quando escapar e quando você está quebrando

URLs são montados a partir de caracteres que significam algo para o analisador e caracteres que são simplesmente dados, e a codificação percentual é como os dois são mantidos separados. Um codificador URL converte o último em `%XX` escapes para que um valor contendo `&`, `?` ou um espaço sobreviva à viagem. A maioria dos bugs URL não são falhas de codificação — eles estão codificando a parte errada ou codificando duas vezes.

Atualizado

O que deve ser codificado

Um pequeno conjunto de caracteres é sempre seguro — letras, dígitos, `-`, `_`, `.` e `~`. Todo o resto é reservado ou deve ser escapado. Caracteres reservados são os interessantes, porque são legais em um URL, mas apenas em posições específicas: `?` inicia uma consulta, `&` separa parâmetros, `=` atribui um valor, `#` inicia um fragmento, `/` separa segmentos de caminho. Coloque um deles dentro de um valor não codificado e você reescreverá silenciosamente a estrutura do URL.

Mais ou% 20

O espaço é o exemplo clássico. Num caminho, um espaço deve ser `%20`; um `+` há uma vantagem literal. Em corpos `application/x-www-form-urlencoded` e strings de consulta lidas por analisadores de formulário, `+` é entendido como um espaço. Essa divergência é a razão pela qual um valor pode codificar algo que funciona em um contexto e quebra em outro, e por que os decodificadores oferecem ambas as interpretações.

Codifique componentes, não URLs inteiros. Executar um URL completo através de um codificador de componente escapa de seus próprios `://` e `?`, produzindo um link que não resolve nada.

A distinção JavaScript que agrada a todos

                encodeURI('https://x.com/a b?q=1')        // keeps :// ? = — for a whole URL
encodeURIComponent('a b?q=1')               // escapes ? and = — for one value
              

`encodeURI` preserva a estrutura de URL e destina-se a um endereço completo; `encodeURIComponent` escapa de tudo que é significativo e se destina a um único valor de parâmetro. Usar o valor errado produz um URL quebrado ou um valor sem escape, e os sintomas são opostos: um link que dá erro 404 ou uma string de consulta que perde metade de seus parâmetros.

Codificação dupla e URLs assinados

Codificar um valor já codificado transforma `%20` em `%2520`, e o servidor então o decodifica uma vez e entrega ao seu aplicativo um `%20` literal onde um espaço era pretendido. Isso aparece em sistemas em camadas – um proxy recodificando um alvo, um cliente escapando de um URL que recebeu já escapado. Isso é mais importante para URLs assinados: as assinaturas são calculadas na string codificada exata, portanto, alterar o escape de um caractere invalida o link, mesmo que ele ainda resolva para o mesmo recurso.

Decodificar para depurar

Quando um link falha, decodificá-lo é a maneira mais rápida de ver o que realmente está sendo solicitado ao servidor — e a resposta geralmente é um valor que vazou para a estrutura. Trabalhar no navegador significa que você pode colar um URL contendo tokens, parâmetros assinados ou identificadores de clientes sem enviá-los para lugar nenhum, que é exatamente o tipo de URL que você não deve colar em um serviço que registra solicitações.

URL Codificador / Decodificador — perguntas frequentes

O espaço deve ser% 20 ou um sinal de mais?

Use `%20` em caminhos e em qualquer URL que você mesmo construir; ambos são válidos em strings de consulta, onde analisadores de formulário convencionalmente leem `+` como um espaço. A decodificação precisa saber qual convenção produziu a string.

Por que codificar meu URL duas vezes o quebra?

Cada passagem escapa ao caractere de escape: um espaço torna-se `%20` e depois `%2520`. Na chegada, o servidor decodifica uma vez e sua aplicação recebe o texto literal `%20`. Codifique uma vez, no ponto onde um valor bruto se torna parte de um URL.

Qual é a diferença entre encodeURI e encodeURIComponent?

`encodeURI` deixa caracteres estruturais como `://`, `?`, `&` e `=` intactos, portanto se adapta a um endereço completo. `encodeURIComponent` também escapa deles, portanto se adapta a um único valor de parâmetro. Misturá-los é a causa da maioria dos links gerados quebrados.

Ferramentas mencionadas nesta postagem

Navegue pela lista completa de 19 ferramentas

Mais artigos para ler

Todas as 19 postagens →