Alguém sabe uma maneira fácil de escapar HTML de seqüências de caracteres no jQuery ? Eu preciso ser capaz de passar uma string arbitrária e fazer com que ela escape corretamente para exibição em uma página HTML (evitando ataques de injeção de JavaScript / HTML). Tenho certeza de que é possível estender o jQuery para fazer isso, mas não sei o suficiente sobre a estrutura no momento para fazer isso.
javascript
jquery
string
escaping
Página
fonte
fonte
Respostas:
Como você está usando jQuery , você pode apenas definir a
text
propriedade do elemento :fonte
$(element2).attr("some-attr", $(element1).html());
Veja este exemplo: jsbin.com/atibig/1/editHá também a solução do moustache.js
fonte
'
é mapeado para uma entidade com um formato decimal , enquanto/
usa o formato hexadecimal .\n
para<br>
?Fonte: http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
fonte
attr()
método do jQuery (a partir de pelo menos 1.8.3) faz sua própria codificação, para que as strings não codificadas possam ser passadas diretamente ; Por exemplo:$('<div/>').attr('test-attr', '\'Tis "fun" & stuff')[0].outerHTML
$('<div/>')
cria um novodiv
elemento que não está anexado ao DOM. Portanto, não mudará nenhum elemento existente. É um pouco confuso como jQuery usa a mesma$()
função tanto para encontrar elementos ($('div')
) e para criá-los, e para mais algumas coisas além disso ... :)Se você está fugindo para HTML, existem apenas três que eu posso pensar que seriam realmente necessários:
Dependendo do seu caso de uso, você também pode precisar de fazer coisas como
"
a"
. Se a lista fosse grande o suficiente, eu apenas usaria uma matriz:encodeURIComponent()
escapará apenas para URLs, não para HTML.fonte
var
para declararitem
localmente; de qualquer maneira, não use umfor … in
loop quando estiver percorrendo um array! Use umfor
loop comum em seu lugar. Oh, e éencodeURIComponent
, nãoescapeURIComponent
.é
; Aqui está uma lista de entidades html, para referência: w3schools.com/tags/ref_entities.aspFácil o suficiente para usar sublinhado:
O Underscore é uma biblioteca de utilitários que fornece muitos recursos que o js nativo não fornece. Há também o lodash, que é a mesma API que o sublinhado, mas foi reescrito para ter melhor desempenho.
fonte
Eu escrevi uma pequena função que faz isso. Ele só escapa
"
,&
,<
e>
(mas geralmente isso é tudo que você precisa de qualquer maneira). É um pouco mais elegante do que as soluções propostas anteriormente, pois usa apenas uma.replace()
para fazer toda a conversão. ( EDIÇÃO 2: complexidade do código reduzida, tornando a função ainda menor e mais organizada, se você estiver curioso sobre o código original, veja o final desta resposta.)Isso é Javascript simples, sem jQuery usado.
Escapando
/
e'
tambémEdite em resposta ao comentário de mklement .
A função acima pode ser facilmente expandida para incluir qualquer caractere. Para especificar mais caracteres para escapar, basta inseri-los na classe de caracteres na expressão regular (ou seja, dentro da
/[...]/g
) e como uma entrada nochr
objeto. ( EDIT 2: Também reduziu esta função, da mesma maneira.)Observe o uso acima de
'
para apóstrofo (a entidade simbólica'
poderia ter sido usado em vez disso - ele é definido em XML, mas não foi originalmente incluído no HTML especificação e pode, portanto, não ser suportado por todos os navegadores Veja:. Artigo da Wikipedia sobre codificação de caracteres em HTML ) Também me lembro de ler em algum lugar que o uso de entidades decimais é mais amplamente suportado do que o hexadecimal, mas não consigo encontrar a fonte para isso agora. (E não pode haver muitos navegadores por aí que não suportem entidades hexadecimais.)Nota: Adicionar
/
e'
à lista de caracteres de escape não é tão útil, pois eles não têm nenhum significado especial em HTML e não precisam ser escapados.escapeHtml
Função originalEDIT 2: A função original usava uma variável (
chr
) para armazenar o objeto necessário para o.replace()
retorno de chamada. Essa variável também precisava de uma função anônima extra para fazer o escopo, tornando a função (desnecessariamente) um pouco maior e mais complexa.Eu não testei qual das duas versões é mais rápida. Se o fizer, sinta-se à vontade para adicionar informações e links sobre isso aqui.
fonte
mustache.js
eunderscore.js
fazê-lo? Falando nisso, ele reconhece apenas as entidades numéricas (representando'
e/
'), na forma hexadecimal maiúscula , quando não está escapando. Assim, o texto escapoumustache.js
- o que curiosamente usa uma mistura de hexadecimal. e formatos decimais - não seria corretamente desviado emunderscore.js
. Gostaria de saber como outras bibliotecas populares lidam com isso.'
têm algum tipo de função reservada em XML (e, portanto, XHTML, eu imagino?), E é por isso que XML (mas não HTML) tem a entidade nomeada'
. Exatamente por que ou de que maneira é "reservado" eu não sei. - Cortes são especiais em URLs, mas isso não realmente garante-los para inclusão em escapar HTML (como codificação de URL é algo completamente diferente).'
: correto: uso seguro apenas em XHTML ; direto da boca da fonte da multidão - ênfase minha: "(...) lido por um processador HTML em conformidade , (...) o uso de & '; ou referências de entidade personalizadas podem não ser suportadas (...)" - na prática : navegadores modernos oferecem suporte mesmo em HTML . Re caso em números hexadecimais. (mesma fonte; grifo meu): "O x deve estar em minúsculas nos documentos XML. [...] O hhhh pode combinar maiúsculas e minúsculas, embora maiúsculas seja o estilo usual ." Deixa-nos imaginar quem decidiu codificar barras; talvez realmente apenas uma confusão entre URI e codificação HTML?/
não é necessária, mas a codificação'
ainda parece útil para lidar com segurança no caso em que uma string codificada é usada como um valor de atributo entre aspas simples .Percebo como estou atrasado para esta festa, mas tenho uma solução muito fácil que não requer jQuery.
Edit: Isso não escapa aspas. O único caso em que as aspas precisariam ser escapadas é se o conteúdo será colado inline em um atributo dentro de uma string HTML. É difícil para mim imaginar um caso em que fazer isso seria um bom design.
Edit 3: Para a solução mais rápida, verifique a resposta acima em Saram. Este é o mais curto.
fonte
<
e>
, também não há benefício em escapar das aspas, a menos que a intenção do conteúdo gerado seja entrar em um atributo.Aqui está uma função JavaScript limpa e clara. Ele escapará de textos como "alguns <muitos" para "alguns poucos".
fonte
Após os últimos testes, posso recomendar a solução javaScript (DOM) nativa mais rápida e completamente compatível com o navegador :
Se você repetir várias vezes, poderá fazê-lo com variáveis preparadas uma vez:
Olhe para o meu desempenho final comparação ( questão da pilha ).
fonte
var p = document.createElement('p'); p.textContent = html; return p.innerHTML;
textContent
função é suportada apenas pelo Chrome 1+, Firefox 2, IE9, Opera 9.64 e Safari 3 (os dois últimos anotados "possivelmente antes"). Isso quebraria a alegação de "OP completamente compatível com vários navegadores".p.innerText = html; return p.innerHTML
Tente Underscore.string lib, ele funciona com jQuery.
resultado:
fonte
_.escape()
função de utilitário.Aprimorei o exemplo mustache.js adicionando o
escapeHTML()
método ao objeto string.Dessa forma, é bastante fácil de usar
"Some <text>, more Text&Text".escapeHTML()
fonte
__entityMap
para o escopo local da função. E envolveu tudo isso emif (typeof String.prototype.escapeHTML !== 'function'){...}
escape()
eunescape()
se destina a codificar / decodificar seqüências de caracteres para URLs, não HTML.Na verdade, eu uso o seguinte snippet para executar o truque que não requer nenhuma estrutura:
fonte
"
s, precisará adicionar pelo menos'
e `` à briga. Esses são realmente necessários apenas para dados de tags de string dentro de elementos em html. Para os próprios dados html (tags externas), apenas os três primeiros são necessários.Se você tiver underscore.js, use
_.escape
(mais eficiente que o método jQuery publicado acima):fonte
Se você estiver seguindo a rota regex, há um erro no exemplo do tghw acima.
fonte
Este é um bom exemplo seguro ...
fonte
Você pode fazer isso facilmente com vanilla js.
Basta adicionar um nó de texto ao documento. Será escapado pelo navegador.
fonte
Sem variáveis globais, alguma otimização de memória. Uso:
O resultado é:
fonte
2 métodos simples que não requerem consulta ...
Você pode codificar todos os caracteres em sua string assim:
Ou apenas como alvo os principais personagens que se preocupar
&
, quebras de linha,<
,>
,"
e'
como:fonte
Exemplo simples de escape de JavaScript:
fonte
fonte
Funciona como um encanto
fonte
Esta resposta fornece os métodos jQuery e JS normais, mas é mais curta sem usar o DOM:
String com escape:
It%27s%20%3E%2020%25%20less%20complicated%20this%20way.
Se os espaços escapados o incomodarem, tente:
String com escape:
It%27s %3E 20%25 less complicated this way.
Infelizmente, a
escape()
função foi descontinuada no JavaScript versão 1.5 .encodeURI()
ouencodeURIComponent()
são alternativas, mas eles ignoram'
, portanto a última linha de código se tornaria isso:Todos os principais navegadores ainda suportam o código curto e, dado o número de sites antigos, duvido que isso mude em breve.
fonte
ES6 one liner para a solução from mustache.js
fonte
Se você estiver salvando essas informações em um banco de dados , é errado escapar do HTML usando um script do lado do cliente , isso deve ser feito no servidor . Caso contrário, é fácil ignorar sua proteção XSS.
Para deixar claro meu argumento, aqui está um exemplo usando uma das respostas:
Digamos que você esteja usando a função escapeHtml para escapar do Html de um comentário no seu blog e depois publicá-lo no seu servidor.
O usuário pode:
Se o usuário colar esse trecho no console, ele ignorará a validação do XSS:
fonte
Todas as soluções são inúteis se você não evitar re-escape, por exemplo, a maioria das soluções seria manter escapar
&
para&
.fonte