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
Mais artigos para ler
5 min de leitura
Base64 decodificar e codificar: para transporte, não para
Base64 decodifique e codifique no navegador — a regra de tamanho 4/3, preenchimento, a variante base64url e o bug do Unicode que faz o texto decodificado parecer lixo.
5 min de leitura
cURL para buscar: movendo uma solicitação do terminal para o
cURL para buscar conversão para JavaScript: cabeçalhos, corpos, autenticação e métodos mapeados corretamente, além da realidade CORS que decide se uma solicitação funciona.
6 min de leitura
JWT decodificador: o que está dentro de um token e o que não
Use um decodificador JWT para inspecionar o cabeçalho, a carga útil e a expiração de um token — e entenda por que a decodificação não está sendo verificada, com as verificações de declaração por trás da maioria dos 401s.