Eu tenho cordas como
var str = 'One & two & three';
renderizado em HTML pelo servidor da web. Eu preciso transformar essas cordas em
'One & two & three'
Atualmente, é isso que estou fazendo (com a ajuda do jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
No entanto, tenho uma sensação perturbadora de que estou fazendo errado. eu tentei
unescape("&")
mas parece que não funciona, nem decodeURI / decodeURIComponent.
Existem outras maneiras mais nativas e elegantes de fazer isso?
javascript
html
text
decode
Arte
fonte
fonte
escape
d ou URI , essas funções não funcionam.𝕫
. Este é um problema com uma especificação em evolução; como tal, você deve escolher uma ferramenta que está sendo mantida para resolvê-la.Respostas:
Uma opção mais moderna para interpretar HTML (texto e outros) do JavaScript é o suporte HTML na
DOMParser
API ( veja aqui no MDN ). Isso permite que você use o analisador HTML nativo do navegador para converter uma string em um documento HTML. É suportado em novas versões de todos os principais navegadores desde o final de 2014.Se quisermos apenas decodificar algum conteúdo de texto, podemos colocá-lo como o único conteúdo no corpo de um documento, analisá-lo e retirá-lo
.body.textContent
.Podemos ver no rascunho da especificação
DOMParser
que o JavaScript não está ativado para o documento analisado, para que possamos realizar essa conversão de texto sem preocupações de segurança.Está além do escopo desta pergunta, mas observe que, se você estiver pegando os nós DOM analisados (não apenas o conteúdo de texto) e os movendo para o documento ao vivo DOM, é possível que seus scripts sejam reativados, e pode haver preocupações de segurança. Eu não pesquisei, então tenha cuidado.
fonte
Você precisa decodificar todas as entidades HTML codificadas ou apenas
&
ela mesma?Se você precisar apenas lidar com
&
isso, poderá fazer o seguinte:Se você precisar decodificar todas as entidades HTML, poderá fazê-lo sem o jQuery:
Observe os comentários de Mark abaixo, que destacam as brechas de segurança em uma versão anterior desta resposta e recomenda o uso, em
textarea
vez dediv
atenuar as possíveis vulnerabilidades do XSS. Essas vulnerabilidades existem se você usa jQuery ou JavaScript simples.fonte
encoded='<img src="bla" onerror="alert(1)">'
o snippet acima mostrará um alerta. Isso significa que, se o texto codificado for proveniente da entrada do usuário, decodificá-lo com esse trecho pode apresentar uma vulnerabilidade XSS.null
depois de receber o texto, o alerta na img não é acionado - jsfiddle.net/Mottie/gaBeb/128alert(1)
ainda é acionado por mim no Chrome no OS X. Se você quiser uma variante segura desse hack, tente usar umtextarea
.Matthias Bynens tem uma biblioteca para isso: https://github.com/mathiasbynens/he
Exemplo:
Sugiro favorecê-lo em relação a hacks que envolvem a configuração do conteúdo HTML de um elemento e a leitura do conteúdo do texto. Tais abordagens podem funcionar, mas são enganosamente perigosas e apresentam oportunidades de XSS se usadas em entradas não confiáveis do usuário.
Se você realmente não consegue carregar uma biblioteca, pode usar o
textarea
hack descrito nesta resposta para uma pergunta quase duplicada, que, diferentemente de várias abordagens semelhantes sugeridas, não possui falhas de segurança que eu conheço:Mas tome nota dos problemas de segurança, afetando abordagens semelhantes a essa, listadas na resposta vinculada! Essa abordagem é um hack, e futuras alterações no conteúdo permitido de um
textarea
(ou bugs em navegadores específicos) podem levar ao código que depende repentinamente de um furo no XSS um dia.fonte
he
é absolutamente ótima! Muito obrigado pela recomendação!Isto é do código fonte ExtJS.
fonte
htmlEnDecode.htmlDecode('€')
deve retornar'€'
, mas retorna'€'
.element.innerText
também faz o truque.fonte
Você pode usar a função de desbloqueio / escape do Lodash https://lodash.com/docs/4.17.5#unescape
str se tornará
'fred, barney, & pebbles'
fonte
Caso você esteja procurando, como eu - enquanto isso, há um método JQuery agradável e seguro.
https://api.jquery.com/jquery.parsehtml/
Você pode f.ex. digite isso no seu console:
Portanto, $ .parseHTML (x) retorna uma matriz e, se você tiver uma marcação HTML em seu texto, o array.length será maior que 1.
fonte
x
tiver um valor<script>alert('hello');</script>
acima, irá falhar. No jQuery atual, na verdade, ele não tenta executar o script, mas[0]
produzundefined
como resultado a chamada paratextContent
falhará e seu script será interrompido por aí.$('<div />').html(x).text();
parece mais seguro - via gist.github.com/jmblog/3222899O jQuery irá codificar e decodificar para você. No entanto, você precisa usar uma tag de área de texto, não uma div.
fonte
.html()
. Assim, mesmo usando umtextarea
não é suficiente para garantir a segurança aqui; Sugiro não usar o jQuery para esta tarefa e escrever código equivalente com a API simples do DOM . (Sim, que o comportamento de idade por jQuery é louco e terrível.)Primeiro crie um
<span id="decodeIt" style="display:none;"></span>
lugar no corpoEm seguida, atribua a string a ser decodificada como innerHTML para isso:
Finalmente,
Aqui está o código geral:
fonte
stringtodecode
contiver algo parecido<script>alert(1)</script>
.uma solução javascript que captura os comuns:
este é o inverso de https://stackoverflow.com/a/4835406/2738039
fonte
map[c] || ''
os não reconhecidos, não serão mostrados comoundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Para caras de uma linha:
fonte
A questão não especifica a origem de,
x
mas faz sentido defender, se pudermos, contra entradas maliciosas (ou simplesmente inesperadas, de nosso próprio aplicativo). Por exemplo, suponhax
tenha um valor de& <script>alert('hello');</script>
. Uma maneira simples e segura de lidar com isso no jQuery é:Encontrado via https://gist.github.com/jmblog/3222899 . Não vejo muitos motivos para evitar o uso dessa solução, pois ela é pelo menos tão curta, se não menor, do que algumas alternativas e fornece defesa contra o XSS.
(Eu originalmente postei isso como um comentário, mas estou adicionando-o como uma resposta, pois um comentário subsequente no mesmo segmento solicitou que eu o fizesse).
fonte
Eu tentei de tudo para remover e de uma matriz JSON. Nenhum dos exemplos acima, mas https://stackoverflow.com/users/2030321/chris deu uma ótima solução que me levou a corrigir meu problema.
Eu não usei, porque não entendi como inseri-lo em uma janela modal que estava puxando dados JSON em uma matriz, mas tentei isso com base no exemplo e funcionou:
Gosto porque era simples e funciona, mas não sei por que não é amplamente utilizado. Pesquisei oi e baixo para encontrar uma solução simples. Continuo buscando a compreensão da sintaxe e se há algum risco em usá-la. Ainda não encontrei nada.
fonte