Codificador / Decodificador URL gratuito

Codifique ou decodifique URLs e componentes URI instantaneamente.

Nenhum dado sai do seu dispositivo

O que a codificação de URL realmente faz

A codificação de URL (também chamada de codificação por porcentagem) é o mecanismo que a web usa para encaixar dados de caracteres arbitrários numa URL. As URLs foram originalmente projetadas para um alfabeto ASCII minúsculo (letras, dígitos e um pequeno conjunto de sinais de pontuação) e os caracteres fora desse alfabeto (espaços, letras acentuadas, ampersands, barras que não são separadores de caminho, emojis, qualquer coisa cirílica, CJK ou árabe) precisam ser escapados antes de poderem viajar com segurança por HTTP, registos do servidor, barras de endereço do navegador, manipuladores de copiar e colar e tubos do shell. A regra de codificação é direta: pegue na sequência de bytes UTF-8 do caractere, escreva cada byte como um sinal de porcentagem seguido de dois dígitos hexadecimais. Um espaço (um byte, 0x20) torna-se %20. Um ampersand (0x26) torna-se %26. O sinal do euro € (três bytes UTF-8 E2 82 AC) torna-se %E2%82%AC. A forma codificada é reversível (qualquer analisador de URL na web sabe como descodificá-la) e o resultado é uma cadeia que contém apenas caracteres ASCII «seguros».

Uma breve história da regra de codificação

A convenção da codificação por porcentagem remonta à RFC 1738 («Uniform Resource Locators (URL)», Tim Berners-Lee, Larry Masinter e Mark McCahill, dezembro de 1994), a primeira especificação formal de URL publicada pela IETF. A RFC 1738 definiu o conjunto original de caracteres «reservados» (caracteres com significado estrutural em URLs que devem ser codificados quando usados como dados) e o conjunto original «não reservados» (caracteres que nunca precisam de codificação). A especificação foi substancialmente revista na RFC 2396 (Berners-Lee, Fielding, Masinter, agosto de 1998) e novamente (de forma definitiva) na RFC 3986 («Uniform Resource Identifier (URI): Generic Syntax», Berners-Lee, Fielding, Masinter, janeiro de 2005), que continua a ser hoje a especificação formal de URI. A RFC 3986 alargou o conjunto não reservado para incluir o til (~), formalizou UTF-8 como codificação para os caracteres não ASCII em IRIs e apertou as regras sobre quando os caracteres reservados devem ser codificados por porcentagem ou deixados tal como estão. Para URIs não ASCII, a RFC 3987 («Internationalized Resource Identifiers», Duerst e Suignard, janeiro de 2005) definiu a extensão IRI que permite que as URLs contenham caracteres Unicode nativos, mapeando a forma IRI para a forma URI padrão por meio de UTF-8 + codificação por porcentagem. Para os nomes de domínio em particular, a RFC 3492 definiu o Punycode (Costello, março de 2003), a codificação usada para representar etiquetas de domínio Unicode (xn--exmpla-...) no DNS, estruturalmente semelhante mas com um algoritmo diferente. A especificação de URL de facto da web moderna é o WHATWG URL Living Standard, editado por Anne van Kesteren, que codifica o comportamento real dos navegadores, por vezes divergindo da RFC 3986 por compatibilidade retroativa com a forma como as URLs funcionam na prática.

Reservados, não reservados e os caracteres que sempre são codificados

A RFC 3986 divide os caracteres de URI em três classes. Os caracteres não reservados: letras A-Z a-z, dígitos 0-9 e os quatro sinais - _ . ~: nunca precisam de codificação e nunca ganham significado quando são codificados. Os caracteres reservados: : / ? # [ ] @ ! $ & ' ( ) * + , ; =: têm significado estrutural em URLs (a barra separa segmentos de caminho, o ponto de interrogação introduz a query, o ampersand separa parâmetros de query, o cardinal introduz o fragmento). Os caracteres reservados podem aparecer não codificados no seu papel estrutural; devem ser codificados quando usados como dados comuns. Todos os outros caracteres: caracteres de controlo, espaços, o próprio porcentagem e qualquer byte de uma sequência UTF-8 não ASCII, devem sempre ser codificados por porcentagem. O caractere porcentagem é especial: deve ser codificado como %25 quando aparece como dado, porque um porcentagem não codificado num contexto de URL introduz uma sequência de escape porcentual que o analisador tentará descodificar. Saltar esse passo produz alguns dos bugs de manipulação de URL mais comuns que existem.

encodeURI vs encodeURIComponent, quando usar cada um

O JavaScript fornece dois codificadores incorporados, ambos padronizados em ECMAScript desde 1999 (ES3). A escolha entre eles é a decisão de codificação de URL mais comum em código web, e enganar-se produz bugs subtis que passam nos testes em entradas simples mas falham com dados reais de utilizador que contêm ampersands, cardinais ou barras.

A regra mental: encodeURIComponent para dados, encodeURI para URLs. Use o errado e quebrará ou a estrutura da URL (encodeURIComponent numa URL inteira escapa as barras e ampersands de que precisava) ou falhará no escape da entrada do utilizador (encodeURI num valor de query deixa passar os ampersands e os seus dados serão analisados como múltiplos parâmetros).

application/x-www-form-urlencoded, a outra codificação

Existe uma segunda codificação, relacionada, usada especificamente para envios de formulários HTML: application/x-www-form-urlencoded. É quase idêntica à codificação porcentual de URL, exceto num pormenor, os espaços são codificados como + em vez de %20. Esta convenção vem da especificação original de formulários HTML e é preservada no URL Living Standard especificamente para o serializador application/x-www-form-urlencoded. Os descodificadores de dados codificados como formulário devem inverter a convenção: um + literal em dados de formulário é codificado como %2B, e um + na cadeia codificada descodifica-se de volta a um espaço. A API URLSearchParams do JavaScript trata desta convenção automaticamente; o encodeURIComponent não: codifica sempre os espaços como %20. Para cadeias de query montadas à mão para uma ação de formulário HTML, use URLSearchParams em vez de chamar encodeURIComponent em cada valor individualmente.

Quando precisa mesmo desta ferramenta

Segurança: porque a codificação importa para além da estética

A codificação incorreta de URL é uma fonte antiga de vulnerabilidades web. O HTTP response splitting explora quebras de linha não codificadas (CR, LF, %0D%0A) em parâmetros de URL que são refletidas em cabeçalhos HTTP, permitindo a um atacante injetar cabeçalhos arbitrários ou até mesmo uma resposta completa. As redireções abertas exploram um tratamento ingénuo de URL que não descodifica nem valida corretamente as URLs fornecidas pelo utilizador antes de redirecionar. A falsificação de pedidos do lado do servidor (SSRF) pode abusar de caracteres codificados para contornar listas brancas de URL, uma expressão regular que bloqueia «http://internal» falha ao apanhar «http://%69nternal» se o servidor descodificar depois da verificação. A injeção SQL via parâmetros de URL não é, em si, uma questão de codificação de URL, mas é agravada quando aspas simples e outros metacaracteres SQL sobrevivem até à consulta à base de dados. A recomendação da OWASP desde o início dos anos 2000 tem sido: codificar na fronteira à entrada, descodificar na fronteira à saída, nunca misturar formas codificadas e descodificadas no mesmo buffer. Esta ferramenta faz exatamente o passo de codificar/descodificar, o que faz com o resultado é consigo, e a responsabilidade da segurança está na camada da aplicação.

Codificação dupla, o bug mais comum

A codificação dupla acontece quando uma cadeia já codificada é codificada de novo. O caractere espaço numa URL já codificada é %20; codifique-o outra vez e obtém %2520 (porque o % codifica-se em %25). Quando o destinatário descodifica uma vez, recebe de volta %20 em vez de um espaço. Quando descodifica duas vezes (nos raros casos em que a dupla-descodificação é suportada), obtém o espaço, mas a maioria dos analisadores não o faz, e a URL contém silenciosamente um %20 visível na barra de endereço. A correção é sempre: descodifique primeiro se não souber se a entrada já está codificada, e depois codifique exatamente uma vez. O mesmo padrão aplica-se em código, nunca chame encodeURIComponent duas vezes na mesma cadeia. Se tiver de transferir um valor entre contextos, descodifique a codificação anterior antes de a codificar de novo para o novo contexto. O botão Trocar desta ferramenta ajuda no ciclo de diagnóstico: cole uma URL suspeita, carregue em Descodificar para ver o que está lá dentro, carregue em Trocar, carregue em Codificar para obter a forma codificada canónica.

Privacidade: execução só no navegador

As URLs incorporam frequentemente dados sensíveis, tokens de autenticação em parâmetros de query, identificadores de utilizador em segmentos de caminho, consultas de pesquisa com contexto pessoal, valores de estado OAuth, URLs de webhook que incluem chaves de API. Os codificadores de URL do lado do servidor guardam uma cópia de cada URL que lá colar nos seus registos. Esta ferramenta usa as funções incorporadas do JavaScript encodeURIComponent, encodeURI, decodeURIComponent e decodeURI a correr localmente no separador do seu navegador. Sem passo de envio, sem telemetria, sem registo, verifique no separador Rede das DevTools enquanto carrega em Codificar (não dispara qualquer pedido), ou ponha a página offline (modo de avião) depois de carregada e o codificador continua a funcionar. Seguro para URLs com tokens, chaves de API, endpoints internos ou qualquer URL que não queira ver copiada para o disco rígido de um estranho.

Perguntas frequentes

Quando devo codificar texto em URL?

Sempre que incorporar entrada de utilizador ou dados com caracteres especiais numa URL, consultas de pesquisa numa cadeia de query, nomes de ficheiro num caminho, valores de parâmetros em pedidos de API, alvos de redireção em fluxos OAuth. Sem codificação, os caracteres especiais ou quebram a estrutura da URL (um & não escapado num valor é interpretado como separador de parâmetros) ou introduzem vulnerabilidades de segurança (uma quebra de linha não escapada permite o HTTP response splitting). A regra prática: qualquer cadeia que contenha algo diferente de letras, dígitos e os quatro sinais -_.~ precisa de codificação antes de entrar numa URL.

O que é codificação dupla e como evitá-la?

A codificação dupla acontece quando texto já codificado é codificado uma segunda vez, transformando %20 em %2520 (porque o próprio caractere porcentagem é codificado como %25). Destinatários que descodificam uma vez recebem a forma meio-descodificada em vez do original. Sempre: se não souber se uma cadeia já está codificada, descodifique-a primeiro e codifique-a exatamente uma vez. Em código, nunca chame encodeURIComponent sobre a saída de outro encodeURIComponent.

Esta ferramenta é segura para URLs sensíveis?

Sim. O codificador/descodificador usa as funções incorporadas do JavaScript a correr inteiramente no seu navegador. A URL que cola nunca atravessa a rede, verifique no separador Rede das DevTools enquanto carrega em Codificar (não dispara qualquer pedido), ou ponha a página offline (modo de avião) depois de carregada. Seguro para URLs com tokens OAuth, chaves de API, endereços de endpoints internos ou qualquer valor que não queira ver registado num servidor de terceiros.

Porque é que os meus dados de formulário têm sinais de mais em vez de %20?

Os envios de formulários HTML usam uma codificação distinta mas relacionada chamada application/x-www-form-urlencoded, que codifica espaços como + em vez de %20 por convenção histórica. Ambas as formas são válidas em cadeias de query de URL; os analisadores modernos aceitam qualquer uma. A API URLSearchParams do JavaScript usa a convenção de formulário; encodeURIComponent usa sempre %20. Se os seus dados precisarem de interoperar com código antigo de tratamento de formulários, use URLSearchParams; em qualquer outro destino, qualquer uma das formas serve.

E os caracteres não ASCII e os emojis?

A codificação de URL moderna usa UTF-8: cada caractere não ASCII é convertido para a sua representação UTF-8 multi-byte, depois cada byte é codificado por porcentagem. O sinal do euro (€, três bytes UTF-8) torna-se %E2%82%AC; um emoji como o foguete 🚀 (quatro bytes) torna-se %F0%9F%9A%80. A RFC 3987 (IRIs) e o WHATWG URL Standard formalizam ambos esta convenção UTF-8 primeiro. Sistemas mais antigos por vezes usavam Latin-1 ou outras codificações; se está a descodificar URLs antigas e o resultado parece embaralhado, a fonte pode ter usado uma codificação de caracteres diferente antes da codificação porcentual.

Ferramentas relacionadas