Quais caracteres precisam ser escapados em HTML?

251

Eles são iguais ao XML, talvez mais o espaço (  )?

Eu encontrei algumas listas enormes de caracteres de escape HTML, mas não acho que eles devam ser escapados. Eu quero saber o que precisa ser escapado.

Ahmet
fonte

Respostas:

318

Se você estiver inserindo conteúdo de texto em seu documento em um local em que o conteúdo de texto é esperado 1 , normalmente você só precisa escapar dos mesmos caracteres que faria em XML . Dentro de um elemento, isso inclui apenas o &e comercial de escape da entidade e o delimitador de elemento menor que e maior que sinais < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Dentro dos valores dos atributos, você também deve escapar do caractere de citação que está usando:

" becomes &quot;
' becomes &#39;

Em alguns casos, pode ser seguro pular a fuga de alguns desses personagens, mas encorajo você a escapar dos cinco em todos os casos para reduzir a chance de cometer um erro.

Se a codificação do documento não suportar todos os caracteres que você estiver usando, como se você estiver tentando usar emoji em um documento codificado em ASCII, também precisará escapar deles. Atualmente, a maioria dos documentos é codificada usando a codificação UTF-8 totalmente compatível com Unicode, onde isso não será necessário.

Em geral, você não deve escapar de espaços como &nbsp;. &nbsp;não é um espaço normal, é um espaço ininterrupto . Você pode usá-los em vez de espaços normais para impedir que uma quebra de linha seja inserida entre duas palavras ou para inserir espaço extra sem que ela seja recolhida automaticamente, mas esse geralmente é um caso raro. Não faça isso a menos que você tenha uma restrição de design que exija.


1 Por "um local onde o conteúdo do texto é esperado", quero dizer dentro de um elemento ou valor de atributo citado, onde as regras de análise normais se aplicam. Por exemplo: <p>HERE</p>ou <p title="HERE">...</p>. O que eu escrevi acima não se aplica a conteúdo que tenha regras ou significado especiais de análise, como dentro de uma tag de script ou estilo, ou como um nome de elemento ou atributo. Por exemplo: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, ou <p NOT-HERE="...">...</p>.

Nesses contextos, as regras são mais complicadas e é muito mais fácil introduzir uma vulnerabilidade de segurança. Eu o desencorajo a inserir conteúdo dinâmico em qualquer um desses locais. Vi equipes de desenvolvedores competentes em segurança introduzirem vulnerabilidades assumindo que eles haviam codificado esses valores corretamente, mas perdendo um caso crítico. Geralmente, existe uma alternativa mais segura, como colocar o valor dinâmico em um atributo e manipulá-lo com JavaScript.

Se necessário, leia as Regras de prevenção de XSS do Open Web Application Security Project para ajudar a entender algumas das preocupações que você precisará ter em mente.

Jeremy Banks
fonte
2
Alguns valores de atributo HTML também podem ter um significado especial (JS / CSS). Portanto, também não se aplica a eles, por exemplo: <p onclick="NOT-HERE">...</p>e <p style="NOT-HERE">...</p>.
geekley
9

Basicamente, existem três caracteres principais que sempre devem ser escapados em seus arquivos HTML e XML, para que eles não interajam com o restante das marcações; portanto, como você provavelmente espera, dois deles serão os wrappers de sintaxe, que são < >, eles estão listados abaixo:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

Também podemos usar aspas duplas (") como" e aspas simples (') como & apos

Evite inserir conteúdo dinâmico <script>e <style>. Essas regras não se aplicam a eles. Por exemplo, se você precisar incluir JSON em a, substitua <por \ x3c, o caractere U + 2028 por \ u2028 e U + 2029 por \ u2029 após a serialização JSON.)

Caracteres de escape em HTML: Lista completa: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Portanto, você precisa escapar de <ou & quando for seguido por qualquer coisa que possa iniciar uma referência de personagem. Além disso, a regra sobre e comercial é a única regra para atributos entre aspas, pois as aspas correspondentes são a única coisa que terminará uma. Mas se você não deseja finalizar o valor do atributo, escape as aspas.

Mudar para UTF-8 significa salvar novamente seu arquivo:

usar a codificação de caracteres UTF-8 para sua página significa que você pode evitar a maioria das fugas e trabalhar apenas com caracteres. Observe, no entanto, que para alterar a codificação do seu documento, não basta alterar a declaração de codificação na parte superior da página ou no servidor. Você precisa salvar novamente o documento nessa codificação. Para obter ajuda sobre como fazer isso com seu aplicativo, consulte Configurando a codificação em aplicativos de criação na web.

Personagens invisíveis ou ambíguos:

Um papel particularmente útil para escapadas é representar caracteres que são invisíveis ou ambíguos na apresentação.

Um exemplo seria o caractere Unicode U + 200F MARCA DA DIREITA PARA A ESQUERDA. Esse caractere pode ser usado para esclarecer a direcionalidade no texto bidirecional (por exemplo, ao usar os scripts em árabe ou hebraico). Entretanto, como não possui forma gráfica, é difícil ver onde esses caracteres estão no texto e, se forem perdidos ou esquecidos, poderão criar resultados inesperados durante a edição posterior. Usar (ou seu equivalente numérico de referência de caracteres) facilita muito a identificação desses caracteres.

Um exemplo de caractere ambíguo é U + 00A0 NO-BREAK SPACE. Esse tipo de espaço evita a quebra de linha, mas se parece com qualquer outro espaço quando usado como caractere. O uso deixa bem claro onde esses espaços aparecem no texto.

Alireza
fonte
3

A resposta exata depende do contexto. Em geral, esses caracteres não devem estar presentes ( HTML 5.2 §3.2.4.2.5 ):

Os nós de texto e os valores de atributo devem consistir em caracteres Unicode, não devem conter U + 0000 caracteres, não devem conter permanentemente caracteres Unicode indefinidos (não caracteres) e caracteres de controle que não sejam caracteres de espaço. Essa especificação inclui restrições extras sobre o valor exato dos nós de texto e os valores dos atributos, dependendo de seu contexto preciso.

Para elementos em HTML, as restrições do modelo de conteúdo de texto também dependem do tipo de elemento. Por exemplo, um "<" dentro de um elemento da área de texto não precisa ser escapado em HTML porque a área de texto é um elemento de texto bruto que pode ser escapado.

Essas restrições estão espalhadas pela especificação. Por exemplo, valores de atributo ( §8.1.2.3 ) não devem conter um e comercial ambíguo e devem estar (i) vazios, (ii) entre aspas simples (e, portanto, não devem conter o caractere APOSTROPHE U + 0027 '), (iii) entre aspas duplas ( não deve conter o caractere U + 0022 QUOTATION MARK ") ou (iv) sem aspas - com as seguintes restrições:

... não deve conter caracteres de espaço literal, caracteres U + 0022 MARCA DE COTAÇÃO ("), caracteres U + 0027 APOSTROPHE ('), caracteres U + 003D EQUALS SIGN (=), caracteres U + 003C MENOS DE SINAL ( <), Caracteres U + 003E SINAL MAIS GRANDE DO QUE (>) ou U + 0060 GRAVE ACCENT (`) e não deve ser a sequência vazia.

Andrey
fonte