Como uso o jQuery para decodificar entidades HTML em uma string?
javascript
jquery
html
EddyR
fonte
fonte
Respostas:
Na verdade, tente
fonte
$("<div/>").html('<img src="http://www.google.com/images/logos/ps_logo2.png" onload=alert(1337)>')
. No Firefox ou Safari, ele dispara o alerta.str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "")
ou algo semelhante.Sem jQuery:
Isso funciona de maneira semelhante à resposta aceita , mas é seguro para uso com entradas não confiáveis do usuário.
Problemas de segurança em abordagens semelhantes
Como observado por Mike Samuel , fazendo isso com um
<div>
em vez de um<textarea>
com a entrada do usuário não confiável é uma vulnerabilidade de XSS, mesmo se a<div>
nunca é adicionado ao DOM:No entanto, esse ataque não é possível contra a
<textarea>
porque não há elementos HTML com conteúdo permitido de a<textarea>
. Consequentemente, qualquer tag HTML ainda presente na string 'codificada' será automaticamente codificada por entidade pelo navegador.* Obrigado a Eru Penkman por capturar esta vulnerabilidade.
fonte
decodedString = textArea.value;
textArea.remove();
return decodedString;
if ('remove' in Element.prototype) textArea.remove();
$("<div />").html(string).text()
executará qualquer javascript na string fornecida , que eu suspeito é o que estava causando o seu problema. A resposta aceita deve ser atualizada para esta.Como Mike Samuel disse, não use jQuery.html (). Text () para decodificar entidades html, pois é inseguro.
Em vez disso, use um processador de modelo como Mustache.js ou decodeEntities de @ comentário de VyvIT.
A biblioteca de utilitários do Underscore.js é fornecida com métodos
escape
eunescape
, mas eles não são seguros para a entrada do usuário:_.escape (string)
_.unescape (string)
fonte
unescape
os documentos até agora, btw._.unescape("'")
resulta em apenas "& # 39;" em vez de aspas simples. Existe algo que eu estou ausente ou não sublinhado não escapa aos códigos de entidade HTML como mostrado em: w3schools.com/tags/ref_entities.aspescape
eunescape
sublinhados ... não são seguros para a entrada do usuário" . O que você quer dizer com isso? Parece bobagem para mim, mas talvez eu esteja perdendo alguma coisa - você pode esclarecer?_.unescape("<img src=fake onerror=alert('boo!')>")
(no Chrome / FF / IE). Mas não apareceu nenhum alerta. Tentei no console e coloquei no meu arquivo JS também. Mesmo resultado.Eu acho que você está confundindo os métodos de texto e HTML. Veja este exemplo: se você usar o HTML interno de um elemento como texto, receberá tags HTML decodificadas (segundo botão). Mas se você usá-los como HTML, obterá a visualização formatada em HTML (primeiro botão).
Primeiro botão escreve: aqui está um conteúdo HTML .
O segundo botão grava: aqui está um conteúdo em <B> HTML </B>.
A propósito, você pode ver um plug-in que encontrei no plugin jQuery - o HTML decodifica e codifica que codifica e decodifica as strings HTML.
fonte
A questão é limitada por 'with jQuery', mas pode ser útil saber que o código jQuery fornecido na melhor resposta aqui faz o seguinte abaixo ... isso funciona com ou sem o jQuery:
fonte
Você pode usar a biblioteca he , disponível em https://github.com/mathiasbynens/he
Exemplo:
Eu desafiei o autor da biblioteca sobre a questão de saber se havia alguma razão para usar essa biblioteca no código do lado do cliente em favor do
<textarea>
hack fornecido em outras respostas aqui e em outros lugares. Ele forneceu algumas justificativas possíveis:Se você estiver usando o node.js.servidor, o uso de uma biblioteca para codificação / decodificação HTML fornece uma solução única que funciona tanto do lado do cliente quanto do lado do servidor.
Alguns algoritmos de decodificação de entidade dos navegadores possuem bugs ou faltam suporte para algumas referências de caracteres nomeadas . Por exemplo, o Internet Explorer decodificará e renderizará espaços não-quebráveis (
) corretamente, mas os reportará como espaços comuns, em vez de espaços não-quebráveis, através dainnerText
propriedade de um elemento DOM , interrompendo o<textarea>
hack (embora apenas em menor grau). Além disso, o IE 8 e 9 simplesmente não suportam qualquer uma das novas referências personagem chamado adicionados em HTML 5. O autor que também abriga um teste de apoio de referência personagem chamado pelo http://mathias.html5.org/tests/html / referências de caracteres nomeados / . No IE 8, ele relata mais de mil erros.Se você deseja se isolar dos bugs do navegador relacionados à decodificação de entidade e / ou conseguir lidar com toda a gama de referências de caracteres nomeados, não pode se safar do
<textarea>
hack; você precisará de uma biblioteca como ele .Ele simplesmente parece que fazer as coisas dessa maneira é menos invasivo.
fonte
codificar:
decodificar:
fonte
Usar
É mais fácil fazê-lo no lado do servidor porque, aparentemente, o JavaScript não possui uma biblioteca nativa para lidar com entidades, nem encontrei nenhum próximo do topo dos resultados de pesquisa para as várias estruturas que estendem o JavaScript.
Procure por "entidades HTML JavaScript" e poderá encontrar algumas bibliotecas para esse fim, mas provavelmente todas elas serão construídas com base na lógica acima - substitua entidade por entidade.
fonte
Eu só precisava ter um caractere de entidade HTML (⇓) como valor para um botão HTML. O código HTML parece bom desde o início no navegador:
Agora eu estava adicionando uma alternância que também deveria exibir o caractere. Esta é a minha solução
Isso exibe ⇓ novamente no botão. Espero que isso ajude alguém.
fonte
"Embed & Share \u21d1"
), ou melhor ainda,"Embed & Share ⇑"
se você puder servir seu script em UTF-8 (ou UTF-16, ou qualquer outra codificação que suporte o caractere)). Usar um elemento DOM para analisar uma entidade HTML apenas para transformar um caractere unicode arbitrário em uma string JavaScript é uma abordagem astuta e criativa que deixaria Rube Goldberg orgulhoso, mas não é uma boa prática; escapes unicode estão no idioma especificamente para lidar com este caso de uso.Você precisa criar uma função personalizada para entidades html:
fonte
Suponha que você tenha abaixo de String.
Nossas cabines Deluxe são aconchegantes, aconchegantes e amplificadas; confortável
str e atribuir de volta a
tag.
é isso aí.
fonte
Para usuários do ExtJS, se você já possui a cadeia codificada, por exemplo, quando o valor retornado de uma função de biblioteca é o conteúdo innerHTML, considere esta função ExtJS:
fonte
Estenda uma classe String:
e use como método:
fonte
Tente o seguinte:
parseHTML é uma função na biblioteca Jquery e retornará uma matriz que inclui alguns detalhes sobre a String fornecida.
em alguns casos, a String está sendo grande; portanto, a função separará o conteúdo em muitos índices.
e para obter todos os dados dos índices, você deve ir a qualquer índice e acessar o índice chamado "wholeText".
Eu escolhi o índice 0 porque ele funcionará em todos os casos (String pequena ou string grande).
fonte
Ainda há um problema: a seqüência de caracteres escapada não parece legível quando atribuída ao valor de entrada
Exapmle: https://jsfiddle.net/kjpdwmqa/3/
fonte
escape
método Underscore.js. Também não há explicação de como seu exemplo de código deve resolver o problema do OP.Como alternativa, há também uma biblioteca para isso.
aqui, https://cdnjs.com/libraries/he
O uso é o seguinte ...
Felicidades.
fonte
Para decodificar entidades HTML com jQuery, basta usar esta função:
Como usar:
Javascript:
HTML:
fonte
A maneira mais fácil é definir um seletor de classe para seus elementos e usar o seguinte código:
Nada mais necessário!
Eu tive esse problema e encontrei esta solução clara e funciona bem.
fonte
Eu acho que é exatamente o oposto da solução escolhida.
fonte