es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

document Ignorar la etiqueta en un documento v-html.

Utilizo la directiva v-html para renderizar de forma segura código html proveniente de mi base de datos: <div v-html="htmlContent">. Algunos de los contenidos html incluyen etiquetas <base target="_self" href="http://some.other.website">. En el momento en que se renderiza este html, “http://some.other.website” se convierte en la base de cualquier solicitud en la página, lo que termina generando muchos errores, por supuesto.

¿Existe alguna práctica recomendada para eliminar o ignorar estas etiquetas? (Supongo que <script> también podría causar algunos comportamientos no deseados).

La única solución “pura” que tengo en mente es usar String.replace con alguna expresión regular para detectar etiquetas potencialmente problemáticas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en vue.js, recomendaría el uso de una biblioteca de saneamiento como DOMPurify para eliminar o ignorar etiquetas y atributos potencialmente dañinos antes de renderizar el contenido HTML. DOMPurify es una biblioteca ampliamente utilizada que sanea HTML y previene ataques XSS. Tiene una opción para permitir solo ciertas etiquetas y atributos, lo que puede ser útil en este caso. Por ejemplo, se podrían permitir solo las etiquetas img, a, p y ul, y los atributos src y href.

    Para utilizar DOMPurify en tu proyecto vue.js, puedes instalarlo a través de npm (npm install dompurify) e importarlo en tu componente:

    import DOMPurify from 'dompurify';
    

    Luego, puedes utilizarlo para sanear el contenido HTML antes de renderizarlo:

    export default {
      data() {
        return {
          htmlContent: '<div><base target="_self" href="http://some.other.website"><p>Hello, world!</p></div>',
        }
      },
      computed: {
        sanitisedHtml() {
          return DOMPurify.sanitize(this.htmlContent, {
            ALLOWED_TAGS: ['img', 'a', 'p', 'ul'],
            ALLOWED_ATTR: ['src', 'href'],
            ALLOW_DATA_ATTR: false,
          });
        }
      },
    }
    

    En este ejemplo, solo se permiten las etiquetas img, a, p y ul, y los atributos src y href, y se desactivan todos los atributos de datos. La propiedad computada sanitisedHtml devuelve el contenido HTML saneado, que luego se puede renderizar utilizando la directiva v-html:

    <div v-html="sanitisedHtml"></div>
    

    De esta manera, cualquier etiqueta o atributo potencialmente dañino es eliminado o ignorado, y el contenido HTML se renderiza de forma segura sin comportamientos no deseados.

Comments are closed.