Estoy usando JavaScript para extraer un valor de un campo oculto y mostrarlo en un cuadro de texto. El valor en el campo oculto está codificado.
Por ejemplo,
<input id='hiddenId' type='hidden' value='chalk & cheese' />
queda atrapado en
<input type='text' value='chalk & cheese' />
a través de algún jQuery para obtener el valor del campo oculto (es en este punto cuando pierdo la codificación):
$('#hiddenId').attr('value')
El problema es que cuando leo chalk & cheese
desde el campo oculto, JavaScript parece perder la codificación. No quiero que sea el valor chalk & cheese
. Quiero amp;
que se conserve el literal .
¿Hay una biblioteca de JavaScript o un método jQuery que codifique HTML una cadena?
chalk
ycheese
alguna vez se usan juntos 0_oRespuestas:
EDITAR: Esta respuesta fue publicada hace mucho tiempo, y la
htmlDecode
función introdujo una vulnerabilidad XSS. Se ha modificado cambiando el elemento temporal dediv
a atextarea
reduciendo la posibilidad de XSS. Pero hoy en día, le animo a usar la API DOMParser como se sugiere en otra respuesta .Yo uso estas funciones:
Básicamente, un elemento de área de texto se crea en la memoria, pero nunca se agrega al documento.
En la
htmlEncode
función configuro elinnerText
del elemento y recupero el codificadoinnerHTML
; en lahtmlDecode
función configuro elinnerHTML
valor del elemento yinnerText
se recupera.Mira un ejemplo en ejecución aquí .
fuente
white-space
propiedad, que sugiere cómo se deben procesar los espacios en el contenido HTML. La presencia de la propiedad implica que "esto está preformateado, se deben preservar los espacios y los saltos de línea". Esto rompe la separación de estilo y contenido, porque si intentas reformatear el HTML para que sea "bonito" o lo vuelves a través de un ciclo de codificación / decodificación como este, entonces se reducen las series de espacios / interrupciones, y el codificador no tiene manera de saber si estuvo bien hacerlo, porque no conoce elwhite-space:pre-*;
indicador en un archivo CSS externo.El truco jQuery no codifica comillas y en IE eliminará su espacio en blanco.
Basado en la etiqueta de escape de Django, que supongo que ya está muy utilizada / probada, hice esta función que hace lo que se necesita.
Podría decirse que es más simple (y posiblemente más rápido) que cualquiera de las soluciones para el problema de eliminación de espacios en blanco, y codifica comillas, lo cual es esencial si va a utilizar el resultado dentro de un valor de atributo, por ejemplo.
Actualización 2013-06-17:
En la búsqueda del escape más rápido, he encontrado esta implementación de un
replaceAll
método:http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(también referenciado aquí: Más rápido método para reemplazar todas las instancias de un carácter en una cadena )
Algunos resultados de rendimiento aquí:
http://jsperf.com/htmlencoderegex/25
Le da una cadena de resultados idéntica a las
replace
cadenas integradas de arriba. ¡¿Sería muy feliz si alguien pudiera explicar por qué es más rápido ?!Actualización 2015-03-04:
Acabo de notar que AngularJS está utilizando exactamente el método anterior:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Añaden un par de refinamientos: parecen estar manejando un oscuro problema de Unicode , así como convirtiendo todos los caracteres no alfanuméricos en entidades. Tenía la impresión de que esto último no era necesario siempre que tenga un juego de caracteres UTF8 especificado para su documento.
Notaré que (4 años después) Django todavía no hace ninguna de estas cosas, así que no estoy seguro de cuán importantes son:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Actualización 2016-04-06:
También puede desear escapar de la barra diagonal
/
. Esto no es necesario para la codificación HTML correcta, sin embargo, OWASP lo recomienda como una medida de seguridad anti-XSS. (gracias a @JNF por sugerir esto en los comentarios)fuente
'
lugar de'
'
no es una entidad HTML válida./g
,.replace()
solo se reemplazará el primer partido.Aquí hay una versión que no es jQuery que es considerablemente más rápida que la
.html()
versión jQuery y la.replace()
versión. Esto conserva todo el espacio en blanco, pero al igual que la versión jQuery, no maneja las comillas.Velocidad: http://jsperf.com/htmlencoderegex/17
Manifestación:
Salida:
Guión:
HTML:
fuente
.replace()
versión no regex sugerida recientemente por @SEoF resulta ser enormemente más rápida: jsperf.com/htmlencoderegex/22/g
,.replace()
solo está haciendo el primer partido.replace('a', 'b', 'g')
lo que funciona igual quereplace(/a/g, 'b')
... la velocidad es idéntica demasiado sin embargoSé que es una pregunta antigua, pero quería publicar una variación de la respuesta aceptada que funcionará en IE sin eliminar líneas:
fuente
El subrayado proporciona
_.escape()
y los_.unescape()
métodos que hacen esto.fuente
Buena respuesta. Tenga en cuenta que si el valor a codificar es
undefined
onull
con jQuery 1.4.2, puede obtener errores como:jQuery("<div/>").text(value).html is not a function
O
Uncaught TypeError: Object has no method 'html'
La solución es modificar la función para verificar un valor real:
fuente
jQuery('<div/>').text(value || '').html()
value
con unif
guardado tiene que crear un DIV sobre la marcha y obtener su valor. Esto puede ser mucho más eficaz sihtmlEncode
se llama mucho Y si es probable quevalue
esté vacío.Para aquellos que prefieren JavaScript simple, este es el método que he usado con éxito:
fuente
FWIW, la codificación no se está perdiendo. La codificación es utilizada por el analizador de marcado (navegador) durante la carga de la página. Una vez que la fuente se lee y analiza y el navegador tiene el DOM cargado en la memoria, la codificación se analiza en lo que representa. Entonces, cuando su JS se ejecuta para leer algo en la memoria, el carácter que obtiene es lo que representa la codificación.
Puedo estar operando estrictamente en semántica aquí, pero quería que entendieras el propósito de la codificación. La palabra "perdido" hace que parezca que algo no funciona como debería.
fuente
Más rápido sin Jquery. Puedes codificar todos los caracteres de tu cadena:
O simplemente apunte a los personajes principales de los que preocuparse (&, inebreaks, <,>, "y ') como:
fuente
Prototype lo tiene incorporado en la clase String . Entonces, si está usando / planea usar Prototype, hace algo como:
fuente
.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
Bastante fácil.Aquí hay una solución javascript simple. Extiende el objeto String con un método "HTMLEncode" que se puede usar en un objeto sin parámetro o con un parámetro.
He hecho un "método HTMLEncode para javascript" .
fuente
Basado en la desinfección de angular ... (sintaxis del módulo es6)
fuente
if (value === null | value === undefined) return '';
un error tipográfico o en realidad una característica? Si es así, ¿por qué usar ese y no el común||
? ¡¡Gracias!!== null
?undefined
es lo único con lo que tenemos equivalencianull
, por lo que no son necesarios dos triples iguales de todos modosnull
y0
ambos son falsos, sí, así que no puedes hacerlo!value
, pero el objetivo==
es facilitar ciertas cosas.0 == null
Es falso.undefined == null
es verdad. puedes hacervalue == null
Hasta donde sé, no hay ningún método de codificación / decodificación HTML directo en javascript.
Sin embargo, lo que puede hacer es usar JS para crear un elemento arbitrario, establecer su texto interno y luego leerlo usando innerHTML.
Digamos, con jQuery, esto debería funcionar:
O algo por el estilo.
fuente
No debería tener que escapar / codificar valores para transferirlos de un campo de entrada a otro.
JS no va insertando HTML sin formato ni nada; solo le dice al DOM que establezca la
value
propiedad (o atributo; no estoy seguro). De cualquier manera, el DOM maneja cualquier problema de codificación por usted. A menos que esté haciendo algo extraño como usardocument.write
oeval
, la codificación HTML será efectivamente transparente.Si está hablando de generar un nuevo cuadro de texto para contener el resultado ... sigue siendo tan fácil. Simplemente pase la parte estática del HTML a jQuery, y luego configure el resto de las propiedades / atributos en el objeto que le devuelve.
fuente
Tuve un problema similar y lo solucioné usando la función
encodeURIComponent
de JavaScript ( documentación )Por ejemplo, en su caso si usa:
y
obtendrá
chalk%20%26%20cheese
. Incluso los espacios se mantienen.En mi caso, tuve que codificar una barra invertida y este código funciona perfectamente
y tengo
name%2Fsurname
fuente
Aquí hay un poco que emula la
Server.HTMLEncode
función de la ASP de Microsoft, escrita en JavaScript puro:El resultado no codifica apóstrofes, pero codifica los otros especiales HTML y cualquier carácter fuera del rango 0x20-0x7e.
fuente
Mi función pure-JS:
fuente
Si quieres usar jQuery. Encontré esto:
http://www.jquerysdk.com/api/jQuery.htmlspecialchars
(parte del complemento jquery.string ofrecido por jQuery SDK)
Creo que el problema con Prototype es que extiende los objetos base en JavaScript y será incompatible con cualquier jQuery que haya utilizado. Por supuesto, si ya está utilizando Prototype y no jQuery, no será un problema.
EDITAR: También existe esto, que es un puerto de las utilidades de cadena de Prototype para jQuery:
http://stilldesigning.com/dotstring/
fuente
Esto es del código fuente ExtJS.
fuente
Saldrá:
<script>alert("I hack your site")</script>
.htmlEncode () estará accesible en todas las cadenas una vez definidas.
fuente
HTML codifica el valor dado
fuente
Me encontré con algunos problemas con la barra invertida en mi cadena Dominio \ Usuario.
Agregué esto a los otros escapes de la respuesta de Anentropic
Que encontré aquí: ¿Cómo escapar de la barra invertida en JavaScript?
fuente
Elegir lo que
escapeHTML()
está haciendo en prototype.jsAgregar este script te ayuda a escapar de HTML:
ahora puede llamar al método escapeHTML en cadenas en su script, como:
Espero que ayude a cualquiera que busque una solución simple sin tener que incluir todo el prototipo.js
fuente
Usando algunas de las otras respuestas aquí, hice una versión que reemplaza todos los caracteres pertinentes en una sola pasada, independientemente de la cantidad de caracteres codificados distintos (solo una llamada a
replace()
), por lo que será más rápido para cadenas más grandes.No depende de la API DOM para existir o de otras bibliotecas.
Habiendo corrido eso una vez, ahora puedes llamar
Llegar
<>&"'
fuente
fuente