¿Hay una manera fácil de tomar una cadena de html en JavaScript y eliminar el html?
javascript
html
string
Bryan
fuente
fuente
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
fuente
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
si está inyectandodocument.write
o concatenando con una cadena que contiene un>
antes de inyectar víainnerHTML
.>
quedará en el segundo. Sin embargo, eso no es un riesgo de inyección. El peligro se produce debido a la<
izquierda en el primero, lo que hace que el analizador HTML esté en un contexto distinto del estado de los datos cuando se inicia el segundo. Tenga en cuenta que no hay transición del estado de datos en adelante>
.<button onClick="dostuff('>');"></button>
Asumir HTML correctamente escrito, aún debe tener en cuenta que un signo mayor podría estar en algún lugar del texto citado en un atributo. También querrás eliminar todo el texto dentro de las<script>
etiquetas, al menos.La forma más simple:
Eso recupera todo el texto de una cadena de HTML.
fuente
Me gustaría compartir una versión editada de la respuesta aprobada del Shog9 .
Como Mike Samuel señaló con un comentario, esa función puede ejecutar códigos JavaScript en línea.
Pero Shog9 tiene razón cuando dice "deja que el navegador lo haga por ti ..."
entonces ... aquí mi versión editada, usando DOMParser :
aquí el código para probar el javascript en línea:
Además, no solicita recursos en análisis (como imágenes)
fuente
Como una extensión del método jQuery, si su cadena podría no contener HTML (por ejemplo, si está tratando de eliminar HTML de un campo de formulario)
devolverá una cadena vacía si no hay HTML
Utilizar:
en lugar.
Actualización: Como se ha señalado en los comentarios, en algunas circunstancias esta solución ejecutará javascript contenido dentro
html
si elhtml
atacante puede influir en el valor de , use una solución diferente.fuente
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Conversión de HTML para correo electrónico de texto sin formato manteniendo intactos los hipervínculos (un href)
La función anterior publicada por hypoxide funciona bien, pero buscaba algo que básicamente convirtiera HTML creado en un editor de texto enriquecido web (por ejemplo, FCKEditor) y borrara todo HTML, pero dejara todos los enlaces porque quería tanto el HTML como la versión de texto sin formato para ayudar a crear las partes correctas para un correo electrónico STMP (HTML y texto sin formato).
Después de un largo tiempo de búsqueda en Google, a mí y a mis colegas se les ocurrió usar el motor de expresiones regulares en Javascript:
La
str
variable comienza así:y luego de que el código se haya ejecutado se ve así
Como puede ver, todo el HTML se ha eliminado y el enlace se ha perseverado con el texto hipervinculado todavía está intacto. También he reemplazado las etiquetas
<p>
y<br>
con\n
(newline char) para que se haya retenido algún tipo de formato visual.Para cambiar el formato del enlace (p. Ej.
BBC (Link->http://www.bbc.co.uk)
) Simplemente edite$2 (Link->$1)
, donde$1
está la URL / URI href y el$2
texto hipervinculado. Con los enlaces directamente en el cuerpo del texto plano, la mayoría de los clientes de correo SMTP los convierten para que el usuario pueda hacer clic en ellos.Espero que encuentres esto útil.
fuente
Una mejora a la respuesta aceptada.
De esta manera, algo así no hará daño:
Firefox, Chromium y Explorer 9+ son seguros. Opera Presto sigue siendo vulnerable. Además, las imágenes mencionadas en las cadenas no se descargan en Chromium y Firefox guardando solicitudes http.
fuente
<script><script>alert();
Esto debería hacer el trabajo en cualquier entorno Javascript (NodeJS incluido).
fuente
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
Alteré la respuesta de Jibberboy2000 para incluir varios
<BR />
formatos de etiquetas, retire todo el interior<SCRIPT>
y<STYLE>
las etiquetas, formatear el HTML resultante mediante la eliminación de múltiples saltos de línea y espacios y convertir algo de código HTML codificada en normal. Después de algunas pruebas, parece que puede convertir la mayoría de las páginas web completas en texto simple donde se retienen el título y el contenido de la página.En el ejemplo simple,
se convierte
La función de JavaScript y la página de prueba se ven así:
Fue utilizado con este HTML:
fuente
/<p.*>/gi
debería ser/<p.*?>/gi
.<br>
etiquetas que podría usar una buena expresión regular en su lugar:/<br\s*\/?>/
de esa manera usted tiene sólo una sustitución en lugar de 3. También me parece que a excepción de la decodificación de las entidades puede tener una sola expresión regular, algo como esto:/<[a-z].*?\/?>/
.Esta es una versión regex, que es más resistente a HTML con formato incorrecto, como:
Etiquetas no cerradas
Some text <img
"<", ">" dentro de los atributos de la etiqueta
Some text <img alt="x > y">
Newlines
Some <a href="http://google.com">
El código
fuente
Otra solución, sin duda menos elegante que la de nickf o Shog9, sería recorrer recursivamente el DOM comenzando en la etiqueta <body> y agregar cada nodo de texto.
fuente
Si desea mantener los enlaces y la estructura del contenido (h1, h2, etc.), debe consultar TextVersionJS . Puede usarlo con cualquier HTML, aunque se creó para convertir un correo electrónico HTML a texto sin formato.
El uso es muy simple. Por ejemplo en node.js:
O en el navegador con js puro:
También funciona con require.js:
fuente
Después de probar todas las respuestas mencionadas, la mayoría, si no todas, tenían casos extremos y no podían satisfacer completamente mis necesidades.
Comencé a explorar cómo lo hace php y encontré la lib php.js que replica el método strip_tags aquí: http://phpjs.org/functions/strip_tags/
fuente
allowed == ''
creo que es lo que solicitó el OP, que es casi lo que Byron respondió a continuación (Byron solo se[^>]
equivocó)allowed
parámetro, es vulnerable a XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
regresa<p onclick="alert(1)">mytext</p>
Cuentas para> atributos internos y
<img onerror="javascript">
en elementos dom recién creados.uso:
manifestación:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
demostración de la respuesta superior haciendo las cosas terribles:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
fuente
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
).Mucha gente ya ha respondido esto, pero pensé que podría ser útil compartir la función que escribí que quita las etiquetas HTML de una cadena pero le permite incluir una serie de etiquetas que no desea quitar. Es bastante corto y ha estado funcionando bien para mí.
fuente
Creo que la forma más fácil es usar expresiones regulares como alguien mencionado anteriormente. Aunque no hay razón para usar un montón de ellos. Tratar:
fuente
[^<>]
con[^>]
porque una etiqueta válida no puede incluir un<
carácter, entonces la vulnerabilidad XSS desaparece.Hice algunas modificaciones al script original de Jibberboy2000 Espero que sea útil para alguien
fuente
Aquí hay una versión que aborda el problema de seguridad de @ MikeSamuel:
Tenga en cuenta que devolverá una cadena vacía si el marcado HTML no es XML válido (es decir, las etiquetas deben estar cerradas y los atributos deben estar entre comillas). Esto no es ideal, pero evita el problema de tener el potencial de explotación de seguridad.
Si no es necesario tener un marcado XML válido, puede intentar usar:
pero esa no es una solución perfecta tampoco por otras razones.
fuente
Puede quitar etiquetas html de forma segura utilizando el atributo iframe sandbox .
La idea aquí es que, en lugar de intentar regexificar nuestra cadena, aprovechamos el analizador nativo del navegador al inyectar el texto en un elemento DOM y luego consultar la propiedad
textContent
/innerText
de ese elemento.El elemento más adecuado para inyectar nuestro texto es un iframe de espacio aislado, de esa manera podemos evitar cualquier ejecución de código arbitrario (también conocido como XSS ).
La desventaja de este enfoque es que solo funciona en los navegadores.
Esto es lo que se me ocurrió (no probado en batalla):
Uso ( demo ):
fuente
let
yconst
. Además, al usar su solución, obtuve muchas referencias deiframes
no utilizadas dentro del documento. Considere agregar undocument.body.removeChild(sandbox)
código en el futuro para futuros lectores basados en copy-pasta.Con jQuery puedes simplemente recuperarlo usando
fuente
El siguiente código le permite retener algunas etiquetas html mientras elimina todas las demás
fuente
phpjs
). Si usa elallowed
parámetro, es vulnerable a XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
regresa<p onclick="alert(1)">mytext</p>
También es posible usar el fantástico analizador htmlparser2 pure JS HTML. Aquí hay una demostración funcional:
La salida será
This is a simple example.
Véalo en acción aquí: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Esto funciona tanto en el nodo como en el navegador si empaqueta su aplicación web utilizando una herramienta como webpack.
fuente
Solo necesitaba quitar las
<a>
etiquetas y reemplazarlas con el texto del enlace.Esto parece funcionar muy bien.
fuente
title="..."
.Para una solución más fácil, intente esto => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
fuente
Yo mismo he creado una expresión regular de trabajo:
fuente
jquery simple de 2 líneas para quitar el html.
fuente
La respuesta aceptada funciona bien en su mayoría, sin embargo, en IE, si la
html
cadena senull
obtiene"null"
(en lugar de ''). Fijo:fuente
Usando Jquery:
fuente
input
el elemento admite solo una línea de texto :Actualización: esto funciona como se esperaba
fuente
Defina esto como un complemento jquery y úselo de la siguiente manera:
fuente