¿Alguien sabe de una manera fácil de escapar de HTML de cadenas en jQuery ? Necesito poder pasar una cadena arbitraria y hacer que se escape correctamente para mostrarla en una página HTML (evitando ataques de inyección de JavaScript / HTML). Estoy seguro de que es posible extender jQuery para hacer esto, pero no sé lo suficiente sobre el marco en este momento para lograr esto.
javascript
jquery
string
escaping
Página
fuente
fuente
Respuestas:
Como está utilizando jQuery , puede establecer la
text
propiedad del elemento :fuente
$(element2).attr("some-attr", $(element1).html());
Vea este ejemplo: jsbin.com/atibig/1/editTambién existe la solución de mustache.js
fuente
'
se asigna a una entidad con un formato decimal , mientras que/
utiliza el formato hexadecimal .\n
a<br>
?Fuente: http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
fuente
attr()
método de jQuery (a partir de al menos 1.8.3) realiza su propia codificación, de modo que las cadenas sin codificar se pueden pasar directamente ; por ejemplo:$('<div/>').attr('test-attr', '\'Tis "fun" & stuff')[0].outerHTML
$('<div/>')
crea un nuevodiv
elemento que no está adjunto al DOM. Por lo tanto, no cambiará ningún elemento existente. Es un poco confuso cómo jQuery usa la misma$()
función tanto para encontrar elementos ($('div')
) como para crearlos, y para algunas cosas más además de ... :)Si está escapando para HTML, solo hay tres que puedo pensar que serían realmente necesarios:
Dependiendo de su caso de uso, es posible que también tenga que hacer cosas como
"
a"
. Si la lista se volviera lo suficientemente grande, solo usaría una matriz:encodeURIComponent()
solo se escapará para las URL, no para HTML.fuente
var
para declararitem
localmente; de todos modos, ¡no uses ningúnfor … in
bucle cuando recorras una matriz! Use unfor
bucle ordinario en su lugar. Ah, y que esencodeURIComponent
, noescapeURIComponent
.é
; Aquí hay una lista de entidades html, para referencia: w3schools.com/tags/ref_entities.aspSuficientemente fácil de usar subrayado:
El subrayado es una biblioteca de utilidades que proporciona muchas características que no proporciona js nativo. También hay lodash, que es la misma API que el subrayado, pero fue reescrito para ser más eficiente .
fuente
Escribí una pequeña y pequeña función que hace esto. Sólo se escapa
"
,&
,<
y>
(por lo general, pero eso es todo lo que necesita de todos modos). Es un poco más elegante que las soluciones propuestas anteriormente, ya que solo usa una.replace()
para hacer toda la conversión. ( EDITAR 2: complejidad de código reducida que hace que la función sea aún más pequeña y ordenada, si tiene curiosidad sobre el código original, vea el final de esta respuesta).Esto es Javascript simple, no se utiliza jQuery.
Escapando
/
y'
tambiénEdite en respuesta al comentario de mklement .
La función anterior se puede ampliar fácilmente para incluir cualquier carácter. Para especificar más caracteres para escapar, simplemente insértelos en la clase de caracteres en la expresión regular (es decir, dentro de
/[...]/g
) y como una entrada en elchr
objeto. ( EDIT 2: también acortó esta función, de la misma manera).Tenga en cuenta el uso anterior de
'
para apóstrofo (la entidad simbólica'
podría haberse utilizado en su lugar; está definida en XML, pero originalmente no se incluyó en la especificación HTML y, por lo tanto, podría no ser compatible con todos los navegadores. Ver: artículo de Wikipedia sobre codificaciones de caracteres HTML ) También recuerdo haber leído en alguna parte que usar entidades decimales es más ampliamente compatible que usar hexadecimal, pero parece que no puedo encontrar la fuente para eso ahora. (Y no puede haber muchos navegadores que no sean compatibles con las entidades hexadecimales).Nota: Agregar
/
y'
a la lista de caracteres escapados no es tan útil, ya que no tienen ningún significado especial en HTML y no es necesario que se escapen.escapeHtml
Función originalEDIT 2: la función original utilizaba una variable (
chr
) para almacenar el objeto necesario para la.replace()
devolución de llamada. Esta variable también necesitaba una función anónima adicional para abarcarla, haciendo que la función (innecesariamente) sea un poco más grande y más compleja.No he probado cuál de las dos versiones es más rápida. Si lo hace, no dude en agregar información y enlaces al respecto aquí.
fuente
mustache.js
yunderscore.js
hacerlo? Hablando de este último: sólo reconoce las entidades numéricas (que representan'
y/
'), en el hexagonal mayúsculas se forman cuando la ONU se escape. Por lo tanto, el texto escapómustache.js
, que curiosamente usa una mezcla de hexadecimal. y formatos decimales: no estarían correctamente sin escapeunderscore.js
. Me pregunto cómo lidian otras bibliotecas populares con eso.'
tienen algún tipo de función reservada en XML, que es la razón XML (pero no HTML) tienen la entidad con nombre (y por lo tanto XHTML, me imagino?)'
. No sé exactamente por qué o de qué manera está "reservado". - Las barras diagonales son especiales en las URL, pero eso no significa realmente justifican su inclusión en ellos de escape HTML (como la codificación URL es algo completamente diferente).'
: correcto: uso seguro solo en XHTML ; directamente de la boca de la fuente de la multitud - énfasis mío: "(...) leído por un procesador HTML conforme , (...) el uso de & apos; o referencias de entidades personalizadas pueden no ser compatibles (...)" - en la práctica : los navegadores modernos lo admiten incluso en HTML . Re case en números hexagonales. (misma fuente; énfasis mío): "La x debe estar en minúsculas en los documentos XML. [...] El hhhh puede mezclar mayúsculas y minúsculas, aunque mayúsculas es el estilo habitual ". Nos deja preguntarnos quién decidió codificar barras; ¿quizás realmente solo una confusión entre la codificación URI y HTML?/
no es necesaria, pero la codificación'
aún parece útil para manejar con seguridad el caso en el que se utiliza una cadena codificada como un valor de atributo encerrado entre comillas simples .Me doy cuenta de lo tarde que llego a esta fiesta, pero tengo una solución muy fácil que no requiere jQuery.
Editar: Esto no escapa a las comillas. El único caso en el que las comillas tendrían que escaparse es si el contenido se va a pegar en línea en un atributo dentro de una cadena HTML. Me resulta difícil imaginar un caso en el que hacerlo sea un buen diseño.
Edición 3: para la solución más rápida, verifique la respuesta anterior de Saram. Este es el más corto.
fuente
<
y>
, tampoco hay ningún beneficio en escapar de las citas, a menos que la intención del contenido generado sea ir a un atributo.Aquí hay una función limpia y clara de JavaScript. Se escapará de texto como "unos pocos <muchos" a "unos pocos & lt; muchos".
fuente
Después de las últimas pruebas, puedo recomendar la solución javaScript (DOM) nativa compatible con el navegador más rápida y completamente compatible :
Si lo repite muchas veces, puede hacerlo con variables una vez preparadas:
Mira mi comparación de rendimiento final ( pregunta de pila ).
fuente
var p = document.createElement('p'); p.textContent = html; return p.innerHTML;
textContent
función solo es compatible con Chrome 1+, Firefox 2, IE9, Opera 9.64 y Safari 3 (estos dos últimos anotados "posiblemente antes"). Por lo tanto, rompería la afirmación de los OP "completamente compatibles con todos los navegadores".p.innerText = html; return p.innerHTML
Prueba Underscore.string lib, funciona con jQuery.
salida:
fuente
_.escape()
función de utilidad.He mejorado el ejemplo de bigote.js agregando el
escapeHTML()
método al objeto de cadena.De esa manera es bastante fácil de usar.
"Some <text>, more Text&Text".escapeHTML()
fuente
__entityMap
a la función de ámbito local. Y envuelto todo esto enif (typeof String.prototype.escapeHTML !== 'function'){...}
escape()
yunescape()
están destinados a codificar / decodificar cadenas para URL, no HTML.En realidad, utilizo el siguiente fragmento para hacer el truco que no requiere ningún marco:
fuente
"
s, entonces necesitas agregar al menos'
y `` a la refriega. Esos solo son realmente necesarios para datos de etiquetas de cadena dentro de elementos en html. Para los datos html en sí (etiquetas externas) solo se requieren los primeros 3.Si tiene underscore.js, use
_.escape
(más eficiente que el método jQuery publicado anteriormente):fuente
Si va por la ruta de expresiones regulares, hay un error en el ejemplo anterior de tghw.
fuente
Este es un buen ejemplo seguro ...
fuente
Puedes hacerlo fácilmente con vanilla js.
Simplemente agregue un nodo de texto al documento. Será escapado por el navegador.
fuente
Sin variables globales, algo de optimización de memoria. Uso:
el resultado es:
fuente
2 métodos simples que NO requieren JQUERY ...
Puede codificar todos los caracteres en su cadena de esta manera:
O simplemente apuntar a los personajes principales que preocuparse
&
, saltos de línea,<
,>
,"
y'
, como:fuente
Ejemplo de escape de JavaScript simple:
fuente
fuente
Funciona de maravilla
fuente
Esta respuesta proporciona los métodos jQuery y JS normales, pero esto es más corto sin usar el DOM:
Cadena escapada:
It%27s%20%3E%2020%25%20less%20complicated%20this%20way.
Si los espacios escapados te molestan, prueba:
Cadena escapada:
It%27s %3E 20%25 less complicated this way.
Desafortunadamente, la
escape()
función fue obsoleta en JavaScript versión 1.5 .encodeURI()
oencodeURIComponent()
son alternativas, pero ignoran'
, por lo que la última línea de código se convertiría en esto:Todos los principales navegadores aún admiten el código corto, y dada la cantidad de sitios web antiguos, dudo que eso cambie pronto.
fuente
ES6 one liner para la solución de mustache.js
fuente
Si está guardando esta información en una base de datos , es incorrecto escapar de HTML utilizando un script del lado del cliente , esto debe hacerse en el servidor . De lo contrario, es fácil eludir su protección XSS.
Para aclarar mi punto, aquí hay un ejemplo usando una de las respuestas:
Digamos que está utilizando la función escapeHtml para escapar del Html de un comentario en su blog y luego publicarlo en su servidor.
El usuario podría:
Si el usuario pega este fragmento en la consola, pasará por alto la validación XSS:
fuente
Todas las soluciones son inútiles si no prevenir la re-escape, por ejemplo, la mayoría de las soluciones mantendrían escapar
&
a&
.fuente