Estou escrevendo um código que gera automaticamente HTML e quero que ele codifique as coisas corretamente.
Digamos que estou gerando um link para o seguinte URL:
http://www.google.com/search?rls=en&q=stack+overflow
Estou assumindo que todos os valores de atributo devem ser codificados em HTML. (Corrija-me se estiver errado.) Isso significa que, se eu estiver colocando o URL acima em uma tag de âncora, codificarei oe comercial da &
seguinte forma:
<a href="http://www.google.com/search?rls=en&q=stack+overflow">
Isso está correto?
Respostas:
Sim, ele é. As entidades HTML são analisadas dentro dos atributos HTML e uma dispersão
&
criaria uma ambiguidade. É por isso que você sempre deve escrever em&
vez de apenas&
dentro de todos os atributos HTML.Dito isto, apenas
&
e aspas precisam ser codificadas. Se você tiver caracteres especiais, comoé
no seu atributo, não precisará codificá-los para satisfazer o analisador HTML.Costumava ser o caso de URLs precisarem de tratamento especial com caracteres não ASCII, como
é
. Você precisava codificar aqueles que usavam escapes percentuais e, nesse caso, daria%C3%A9
, porque eles foram definidos pela RFC 1738 . No entanto, o RFC 1738 foi substituído pelo RFC 3986 (URIs, Uniform Resource Identifiers) e RFC 3987 (IRIs, Internationalized Resource Identifiers), no qual o WhatWG baseou seu trabalho para definir como os navegadores devem se comportar quando virem um URL com ASCII não. caracteres desde HTML5 . Portanto, agora é seguro incluir caracteres não ASCII em URLs, codificados em porcentagem ou não.fonte
é
ainda precisa de codificação: stackoverflow.com/questions/2742852/unicode-characters-in-urls&
no atributo tag em vez de usá-lo diretamente&
.Pelas recomendações oficiais atuais do HTML, o e comercial deve ser escapado, por exemplo, como
&
em contextos como este. No entanto, os navegadores não precisam, e o HTML5 CR propõe fazer disso uma regra , para que regras especiais sejam aplicadas nos valores dos atributos. Os validadores HTML5 atuais estão desatualizados a esse respeito (consulte o relatório de erros com comentários).Continua sendo possível escapar dos e comerciais nos valores dos atributos, mas, além da validação com as ferramentas atuais, não há necessidade prática de evitá-los nos
href
valores (e há um pequeno risco de cometer erros se você começar a evitá-los).fonte
application/xhtml+xml
) provavelmente sempre o exigirá.&
deveria estar bem agora, desde que seja " un ambígua". Uma maneira óbvia de tornar o e comercial ambíguo é segui-lo primeiro com caracteres não espaciais e, em seguida, um ponto e vírgula. Isso comercial agora é ambígua, e irá causar um erro de análise.&
seja ambíguo. Portanto, continuamos a usá-lo não codificado em atributos href.Estou postando uma nova resposta porque acho que a resposta do zneak não tem exemplos suficientes, não mostra o manuseio de HTML e URI como aspectos e padrões diferentes e tem algumas pequenas coisas ausentes.
Você tem dois padrões sobre URLs nos links (
<a href
).O primeiro padrão é o RFC 1866 (HTML 2.0), onde em "3.2.1. Caracteres de Dados" você pode ler os caracteres que precisam ser escapados quando usados como valor para um atributo HTML. (Os atributos em si não permitem caracteres especiais, por exemplo,
<a hr&ef="http://...
não é permitido nem é<a hr&ef="http://...
.)Posteriormente, isso passou para o padrão HTML 4 , os caracteres dos quais você precisa escapar são:
O outro padrão é o RFC 3986 "Padrão de URI genérico", em que os URLs são manipulados (isso acontece quando o navegador está prestes a seguir um link porque o usuário clicou no elemento HTML).
É importante escapar desses caracteres para que o cliente saiba se eles representam dados ou um delimitador.
Exemplo sem escape:
Exemplo, URL totalmente legítimo
Exemplo de URL totalmente legítimo no valor do atributo HTML:
Também cenários importantes:
Javascript como um valor:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Sim,;;
está correto.)JSON como um valor:
<a href="..." data-analytics="{"event": "click"}">...</a>
Escapou coisas dentro de coisas escapadas, codificação dupla, URL dentro de URL dentro de parâmetro etc, ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123
fonte
Sim, você deve converter
&
para&
.Essa ferramenta de validação html do W3C é útil para perguntas como esta. Ele informará os erros e avisos de uma página específica.
fonte
&
em um href) como um erro.