Skip to main content
Validação HTML

Valor incorreto para o atributo “action” no elemento “form”: A percentagem (“%”) não é seguida por dois dígitos hexadecimais.

Sobre este problema HTML

Em URLs, certos caracteres devem ser codificados por percentagem — um processo onde um carácter é substituído por % seguido de exatamente dois dígitos hexadecimais que representam o seu valor em byte. Por exemplo, um espaço torna-se %20, uma hash torna-se %23, e um ampersand torna-se %26. O próprio carácter % é o prefixo de escape, por isso quando um parser de URL encontra %, espera que os próximos dois caracteres sejam dígitos hexadecimais válidos (0–9, A–F, a–f). Se não forem, o URL está mal formado.

Este erro de validação surge tipicamente em alguns cenários:

  • Um % literal é usado no URL sem codificação. Por exemplo, um nome de ficheiro ou segmento de caminho contém um símbolo % que não foi convertido para %25.
  • Uma sequência de codificação por percentagem incompleta ou corrompida. Alguém pode ter codificado parcialmente um URL, deixando para trás sequências como %G5 ou %2 que não formam códigos hexadecimais válidos de dois dígitos.
  • Erros de copiar-colar. Um URL foi colado de uma fonte que removeu caracteres ou introduziu símbolos % soltos.

Isto importa porque os browsers podem interpretar URLs mal formados de forma inconsistente. Um browser pode tentar “corrigir” o URL codificando o % solto, enquanto outro pode deixá-lo passar como está, levando a submissões de formulário quebradas ou comportamento inesperado no lado do servidor. Garantir URLs válidos no atributo action assegura comportamento previsível em todos os browsers e está em conformidade tanto com o WHATWG URL Standard como com a especificação HTML.

Como corrigir

  1. Localize cada % no URL. Verifique se cada % é seguido por exatamente dois dígitos hexadecimais (por exemplo, %20, %3A, %7E).
  2. Codifique caracteres % literais. Se um % é para aparecer como um carácter literal no URL (não como parte de uma sequência de codificação por percentagem), substitua-o por %25.
  3. Corrija sequências incompletas. Se existir uma sequência como %2 ou %GZ, determine o carácter pretendido e codifique-o corretamente, ou remova o % solto.
  4. Use ferramentas de codificação adequadas. Em JavaScript, use encodeURIComponent() ou encodeURI() para codificar URLs de forma segura. A maioria das linguagens do lado do servidor têm funções equivalentes (por exemplo, urlencode() em PHP, urllib.parse.quote() em Python).

Exemplos

% literal não codificado

Isto despoleta o erro porque %d não é uma sequência de codificação por percentagem válida (d é apenas um carácter, e o que se segue pode não ser hexadecimal):

<!-- ❌ Mau: % isolado não seguido por dois dígitos hexadecimais -->

<form action="/search?discount=20%off">
  <button type="submit">Search</button>
</form>

Codifique o % como %25:

<!-- ✅ Bom: % literal codificado como %25 -->

<form action="/search?discount=20%25off">
  <button type="submit">Search</button>
</form>

Sequência de codificação por percentagem incompleta

Aqui, %2 está em falta o seu segundo dígito hexadecimal:

<!-- ❌ Mau: %2 é uma sequência incompleta -->

<form action="/path/to%2file.html">
  <button type="submit">Submit</button>
</form>

Se a intenção era codificar um carácter / (%2F), complete a sequência:

<!-- ✅ Bom: codificação por percentagem completa para "/" -->

<form action="/path/to%2Ffile.html">
  <button type="submit">Submit</button>
</form>

Caracteres hexadecimais inválidos após %

Os caracteres G e Z não são dígitos hexadecimais:

<!-- ❌ Mau: %GZ não é hexadecimal válido -->

<form action="/data%GZprocess">
  <button type="submit">Go</button>
</form>

Se %GZ nunca foi pretendido como codificação, escape o próprio %:

<!-- ✅ Bom: % literal adequadamente codificado -->

<form action="/data%25GZprocess">
  <button type="submit">Go</button>
</form>

Usar JavaScript para codificar de forma segura

Ao construir URLs dinamicamente, use funções de codificação integradas para evitar este problema completamente:

const query = "20% off";
const safeURL = "/search?q=" + encodeURIComponent(query);
// Resultado: "/search?q=20%25%20off"

Isto garante que cada carácter especial — incluindo % — é adequadamente codificado por percentagem antes de ser colocado no atributo action.

Encontre problemas como este automaticamente

O Rocket Validator analisa milhares de páginas em segundos, detetando problemas HTML em todo o seu site.

Ajude-nos a melhorar os nossos guias

Este guia foi útil?

Pronto para validar os seus sites?
Comece o seu teste gratuito hoje.