Estou usando JavaScript para extrair um valor de um campo oculto e exibi-lo em uma caixa de texto. O valor no campo oculto é codificado.
Por exemplo,
<input id='hiddenId' type='hidden' value='chalk & cheese' />
é puxado para dentro
<input type='text' value='chalk & cheese' />
via algum jQuery para obter o valor do campo oculto (é nesse ponto que perco a codificação):
$('#hiddenId').attr('value')
O problema é que, quando leio chalk & cheese
do campo oculto, o JavaScript parece perder a codificação. Eu não quero que o valor seja chalk & cheese
. Eu quero que o literal amp;
seja retido.
Existe uma biblioteca JavaScript ou um método jQuery que codificará uma string em HTML?
chalk
echeese
sempre usado em conjunto 0_oRespostas:
EDIT: Esta resposta foi postada há muito tempo, e a
htmlDecode
função introduziu uma vulnerabilidade XSS. Foi modificado alterando o elemento temporário de adiv
paratextarea
reduzir a chance de XSS. Hoje em dia, porém, eu encorajo você a usar a API DOMParser, conforme sugerido em outra resposta .Eu uso estas funções:
Basicamente, um elemento de área de texto é criado na memória, mas nunca é anexado ao documento.
Na
htmlEncode
função, defino oinnerText
do elemento e recupero o codificadoinnerHTML
; nahtmlDecode
função, defino oinnerHTML
valor do elemento e oinnerText
é recuperado.Veja um exemplo em execução aqui .
fonte
white-space
propriedade, o que sugere como os espaços no conteúdo HTML devem ser processados. A presença da propriedade implica que "isto é pré-formatado, espaços e quebras de linha devem ser preservados". Isso interrompe a separação entre estilo e conteúdo, porque se você tentar reformatar o HTML para que seja "bonito" ou percorrê-lo através de um ciclo de codificação / decodificação como esse, as execuções de espaços / interrupções serão reduzidas e o codificador não terá maneira de saber se estava certo fazê-lo, porque não está ciente dowhite-space:pre-*;
indicador em um arquivo CSS externo!O truque do jQuery não codifica aspas e, no IE, reduz o espaço em branco.
Baseado no template de escape no Django, que eu acho que já é muito usado / testado, criei essa função que faz o que é necessário.
É sem dúvida mais simples (e possivelmente mais rápido) do que qualquer uma das soluções alternativas para o problema de remoção de espaços em branco - e codifica aspas, o que é essencial se você usar o resultado dentro de um valor de atributo, por exemplo.
Atualização 2013-06-17:
Na busca pela fuga mais rápida, encontrei esta implementação de um
replaceAll
método:http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(também referenciada aqui: mais rápida método para substituir todas as instâncias de um caractere em uma string )
Alguns resultados de desempenho aqui:
http://jsperf.com/htmlencoderegex/25
Ele fornece uma sequência de resultados idêntica às
replace
cadeias internas acima. Ficaria muito feliz se alguém pudesse explicar por que é mais rápido !?Atualização 2015-03-04:
Acabei de perceber que o AngularJS está usando exatamente o método acima:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Eles adicionam alguns refinamentos - eles parecem estar lidando com um problema Unicode obscuro , além de converter todos os caracteres não alfanuméricos em entidades. Fiquei com a impressão de que o último não era necessário, desde que você tenha um conjunto de caracteres UTF8 especificado para o seu documento.
Vou notar que (4 anos depois) o Django ainda não faz nenhuma dessas coisas, então não tenho certeza de quão importantes elas são:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Atualização 06/06/2016:
Você também pode querer escapar da barra
/
. Isso não é necessário para a codificação HTML correta, no entanto, é recomendado pelo OWASP como uma medida de segurança anti-XSS. (obrigado a @JNF por sugerir isso nos comentários)fonte
'
vez de'
'
não é uma entidade HTML válida./g
,.replace()
substituirá apenas a primeira partida.Aqui está uma versão que não é do jQuery que é consideravelmente mais rápida que a
.html()
versão do jQuery e a.replace()
versão. Isso preserva todo o espaço em branco, mas, como a versão do jQuery, não manipula aspas.Velocidade: http://jsperf.com/htmlencoderegex/17
Demo:
Resultado:
Roteiro:
HTML:
fonte
.replace()
versão não regex recentemente sugerida por @SEoF acaba sendo extremamente mais rápida: jsperf.com/htmlencoderegex/22/g
,.replace()
está apenas fazendo a primeira partida.replace('a', 'b', 'g')
replace(/a/g, 'b')
Sei que é antiga, mas queria postar uma variação da resposta aceita que funcionará no IE sem remover linhas:
fonte
Sublinhado fornece
_.escape()
e_.unescape()
métodos que fazem isso.fonte
Boa resposta. Observe que, se o valor a codificar for
undefined
ounull
com o jQuery 1.4.2, você poderá obter erros como:jQuery("<div/>").text(value).html is not a function
OU
Uncaught TypeError: Object has no method 'html'
A solução é modificar a função para verificar um valor real:
fonte
jQuery('<div/>').text(value || '').html()
value
com umaif
economia de criar um DIV on the fly e pegar seu valor. Isso pode ter muito mais desempenho sehtmlEncode
for chamado muito E se for provável quevalue
ele esteja vazio.Para aqueles que preferem javascript simples, eis o método que usei com sucesso:
fonte
FWIW, a codificação não está sendo perdida. A codificação é usada pelo analisador de marcação (navegador) durante o carregamento da página. Depois que a fonte é lida e analisada e o navegador carrega o DOM na memória, a codificação é analisada no que representa. Assim, quando seu JS é executado para ler qualquer coisa na memória, o caractere recebido é o que a codificação representa.
Talvez eu esteja operando estritamente na semântica aqui, mas queria que você entendesse o propósito da codificação. A palavra "perdido" faz parecer que algo não está funcionando como deveria.
fonte
Mais rápido sem o Jquery. Você pode codificar todos os caracteres da sua string:
Ou apenas alveje os personagens principais com os quais se preocupar (&, inebreaks, <,>, "e ') como:
fonte
O protótipo foi incorporado à classe String . Portanto, se você estiver usando / planeja usar o Prototype, ele fará algo como:
fonte
.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
Fácil o suficiente.Aqui está uma solução javascript simples. Ele estende o objeto String com um método "HTMLEncode" que pode ser usado em um objeto sem parâmetro ou com um parâmetro.
Eu criei uma essência "método HTMLEncode para javascript" .
fonte
Baseado na higienização angular ... (sintaxe do módulo es6)
fonte
if (value === null | value === undefined) return '';
incorreto ou é um recurso? Se sim, por que usar esse e não o comum||
? Obrigado!!== null
?undefined
é a única coisa com a qual ter equivalêncianull
; portanto, dois triplos iguais não são necessários de qualquer maneiranull
e0
ambos são falsos, sim, então você não pode simplesmente fazer isso!value
, mas o objetivo==
é facilitar algumas coisas.0 == null
é falso.undefined == null
é verdade. você pode apenas fazervalue == null
Tanto quanto eu sei, não há nenhum método HTML Encode / Decode em javascript.
No entanto, o que você pode fazer é usar JS para criar um elemento arbitrário, definir seu texto interno e, em seguida, lê-lo usando innerHTML.
Digamos que, com o jQuery, isso funcione:
Ou algo nesse sentido.
fonte
Você não precisa escapar / codificar valores para transferi-los de um campo de entrada para outro.
JS não vai inserir HTML bruto ou qualquer coisa; apenas informa ao DOM para definir a
value
propriedade (ou atributo; não tenho certeza). De qualquer forma, o DOM lida com qualquer problema de codificação para você. A menos que você esteja fazendo algo estranho como usardocument.write
oueval
, a codificação HTML será efetivamente transparente.Se você está falando sobre gerar uma nova caixa de texto para manter o resultado ... ainda é fácil. Apenas passe a parte estática do HTML para jQuery e defina o restante das propriedades / atributos no objeto que ele retornar para você.
fonte
Eu tive um problema semelhante e resolvi-o usando a função
encodeURIComponent
do JavaScript ( documentação )Por exemplo, no seu caso, se você usar:
e
você receberá
chalk%20%26%20cheese
. Mesmo espaços são mantidos.No meu caso, tive que codificar uma barra invertida e esse código funciona perfeitamente
e eu tenho
name%2Fsurname
fonte
Aqui está um pouco que emula a
Server.HTMLEncode
função do ASP da Microsoft, escrita em JavaScript puro:O resultado não codifica apóstrofes, mas codifica os outros especiais em HTML e qualquer caractere fora do intervalo 0x20-0x7e.
fonte
Minha função JS pura:
fonte
Se você deseja usar o jQuery. Eu achei isto:
http://www.jquerysdk.com/api/jQuery.htmlspecialchars
(parte do plugin jquery.string oferecido pelo jQuery SDK)
O problema com o Prototype, acredito, é que ele estende objetos de base em JavaScript e será incompatível com qualquer jQuery que você possa ter usado. Obviamente, se você já estiver usando o Prototype e não o jQuery, não será um problema.
EDIT: Também existe isso, que é uma porta dos utilitários de string do Prototype para jQuery:
http://stilldesigning.com/dotstring/
fonte
Isto é do código fonte ExtJS.
fonte
Saída:
<script>alert("I hack your site")</script>
.htmlEncode () estará acessível em todas as strings, uma vez definidas.
fonte
Html Codifica o valor fornecido
fonte
Corri alguns problemas com barra invertida na minha string Domain \ User.
Eu adicionei isso às outras fugas da resposta da Anentropic
O que encontrei aqui: Como escapar da barra invertida em JavaScript?
fonte
Escolhendo o que
escapeHTML()
está fazendo no prototype.jsAdicionar este script ajuda você a escaparHTML:
agora você pode chamar o método escapeHTML em cadeias de caracteres em seu script, como:
Espero que ajude quem procura uma solução simples sem precisar incluir todo o prototype.js
fonte
Usando algumas das outras respostas aqui, criei uma versão que substitui todos os caracteres pertinentes em uma passagem, independentemente do número de caracteres codificados distintos (apenas uma chamada para
replace()
), para que seja mais rápido para seqüências maiores.Ele não depende da API do DOM para existir ou de outras bibliotecas.
Depois de executá-lo uma vez, agora você pode ligar
Para obter
<>&"'
fonte
fonte