Respostas:
Não tenho privilégios para comentar, ou deixaria isso como um comentário em uma resposta anterior.
Repito, NÃO escape de um apóstrofo em HTML usando
'
Esta não é uma referência de entidade de caracteres HTML válida. É uma referência de entidade de caracteres XML. Embora o Firefox e o Chrome processem o exposto acima como um apóstrofo em um documento HTML, o Internet Explorer não. E segue o padrão quando se recusa a fazê-lo.
Você pode escapar de um apóstrofo em HTML usando
'
Mas não acredito que seja, em geral, necessário.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Eu não concordo com Nate. Idealmente, você deve usar o mínimo de escape possível e usar UTF-8 para expressar caracteres nativamente. Para fazer isso, você precisa de um editor que possa manipular UTF-8, bem como uma declaração de conjunto de caracteres correta, como:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
No entanto, você deve criar o hábito de escapar dos caracteres que têm um significado especial no HTML (X), a saber:
< <
> >
" "
& &
' '
Isso garantirá que você não esteja escrevendo acidentalmente a marcação quando desejar escrever esses caracteres. Isso é especialmente importante para a entrada do usuário, para manter a segurança. É menos óbvio, mas é realmente importante escapar "
. Se uma string terminar em um atributo HTML ( title="something"
etc.), o usuário poderá finalizar o atributo e inserir sua própria marcação. Imagine o que acontece se o usuário entrar " onclick="alert('hello');
e você inserir isso paratitle="..."
Se você estiver usando PHP, poderá usar a htmlspecialchars
função para fazer isso. Outros idiomas podem ter outras funções semelhantes.
Atualização: Eu estou corrigido sobre a questão apos. Maldito IE traquina.
'
não use '
. Se, por qualquer motivo, você usar aspas simples para um atributo HTML, como title='something'
obviamente deve escapar de aspas simples dentro desse valor do atributo.
Depende do seu caso de uso, mas provavelmente não devemos usar '
a linguagem natural em geral; portanto, o problema não deve surgir, a menos que você tenha código de computador em seu XML.
Onde traduzimos as strings, descobrimos que alguns tradutores substituem as aspas finais pelas aspas encaracoladas unicode, mas deixam as aspas retas como as aspas iniciais, deixando-as visualmente desequilibradas e com aparência não profissional.
Os caracteres unicode ‘
e ’
devem substituir sempre '
que possível, tanto quanto “
e ”
devem substituir "
. Isso é útil porque os computadores não reconhecem pontuação pontual como especial. (Embora eu esteja divertido ao ver que o Stack Overflow / Chrome considera " don’t
'um erro de ortografia, ao passo que está satisfeito com' don't
').
Não ajuda que tenhamos os personagens '
e os "
personagens muito atraentes no teclado.
Então, vamos ver se o StackExchange codifica um apóstrofo usando uma entidade HTML.
Aqui estão alguns exemplos do código fonte desta página.
(1) Título da pergunta: Codificado.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) resposta de drew: Não codificado.
But I don't believe it is, in general, necessary.
(3) Comentário de Tom sobre a resposta de nitro2k01: Codificado.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
Então, é nos dois sentidos.
No entanto, o código fonte desta página nunca é usado '
. Todas as codificações são da forma '
. Isso é consistente com o nitro2k01 e os conselhos de Drew para não usar '
.
Sua resposta depende do contexto:
Se você estiver escrevendo um parágrafo em HTML com esses dados, pode ser suficiente escapar <,> e &:
<p>{string}</p>
Se você estiver escrevendo em um atributo HTML, como
<a href='/some/path/{string}'>...</a>
Então você deve absolutamente escapar do apóstrofo. Pode ser um vetor de ataque se um invasor colocar isso em string
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
O mesmo vale para aspas duplas. Eu até li que o backtick `é vulnerável, pois também pode ser usado para atributos HTML. Se você não tiver um script automático de verificação de sintaxe HTML como parte de suas rotinas de implantação, suponha que qualquer um desses três possa ser usado e deve ser escapado para atributos HTML.
No extremo, mesmo atributos não citados são válidos, portanto, o caractere de espaço também precisaria ser escapado. E !
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
, e ]
, tudo o que pode sair de um atributo e permitir a inserção de um novo.
Para escapar em JavaScript, eu uso o JQuery $(element).text(string)
ou $(element).attr(attrname, string)
para fazer a fuga para mim. Tenha muito cuidado com $(element).html(unsafe)
, o que não escapa ao seu HTML!
No código do lado do servidor, tenho que avaliar cuidadosamente o risco de cada caso e ler a documentação cuidadosamente. Isso dependerá da linguagem e das bibliotecas específicas que você estiver usando, como Rails, Django, PHP bruto, Drupal, etc.
Se você está pensando em interromper o problema o mais cedo possível, antes que ele entre no seu banco de dados, aguarde. Escapar em HTML do texto armazenado em seu banco de dados pode levá-lo a um passeio infernal. E se você quiser posteriormente permitir determinadas tags HTML, mas não outras, como itálico, negrito, cores e tabelas? E se você perdesse alguma coisa no seu primeiro passe, mas seu escaper já escapasse &
como &
e "
como "
? Será que vai transformá-los &amp;
e &quot;
?
Minha abordagem é executar apenas escape SQL para o banco de dados, mas deixar todos os caracteres especiais em HTML para processamento posterior. Dessa forma, eu posso depurar e ajustar meu HTML escapa facilmente. Lembre-se, isso também significa que não posso confiar em minhas próprias tabelas SQL se elas tiverem strings fornecidas pelo usuário.
Nunca confie na entrada controlada pelo usuário e sempre cite seus atributos HTML!
Baseado em: há mais no escape HTML do que &, <,> e " de Ryan Grove
Se o seu apóstrofo pertence ao conteúdo, escape. Quaisquer outros caracteres de conteúdo que possam ser confundidos com o código, escapam dele.
A maneira mais fácil de fazer o trabalho sem usar a entidade real é usar PHP htmlentities()
ou htmlspecialchars()
funções:
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&apos
válido agora para HTML5. Dito isto, se você tiver que oferecer suporte a navegadores herdados ou escrever e-mails em HTML para o Outlook, é melhor se atentar'
se considerar necessário escapar do personagem.