Creación de un Componente React para Sanitizar HTML
Resumen
¿Cómo solucionar problemas de HTML en la vista del producto en React?
En el desarrollo de aplicaciones web con React, es común enfrentarse a problemas relacionados con el manejo del HTML, especialmente cuando se reciben strings con etiquetas HTML insertadas. Este tutorial te guiará para solucionar estos problemas al crear un componente que mitigue vulnerabilidades y errores de hidratación. Veremos cómo sanitizar HTML para asegurar la protección contra ataques de XSS y optimizar la interfaz.
¿Cuál es el problema inicial con la inyección de HTML en React?
Inyectar HTML en una aplicación React directamente desde un string puede generar:
Problemas de hidratación: El HTML inicial y el generado en el cliente pueden no coincidir.
Vulnerabilidades de XSS (Cross Site Scripting): Pueden inyectarse scripts maliciosos.
El uso de la inyección peligrosa de HTML en React puede parecer una solución rápida, pero entraña riesgos considerables. Por ejemplo, al intentar incluir el HTML directamente, puede resultar en errores y abrir puertas a posibles ataques.
¿Cómo crear un componente React para sanitizar HTML?
Para resolver estos inconvenientes, se puede crear un componente especializado en sanitizar el HTML. La clave está en procesar el HTML entrante, eliminando cualquier etiqueta o característica que pueda comprometer la seguridad o causar inconsistencias.
Crear el archivo del componente
Primero, organizamos el proyecto:
Ubicación del componente: Debe ubicarse en una carpeta Shared para uso común. Crear un archivo sanitized.html.tsx.
Configurar las props: Definir una interfaz o tipo que represente las propiedades del componente. A través del uso de HTMLAttributes de React, podemos integrar otras propiedades.
¿Cómo integrar el componente en la vista del producto?
Una vez definido el componente de sanitización, se puede integrar en la vista del producto:
Importar y reemplazar la inyección peligrosa: Importar el componente SanitizedHTML y usarlo en lugar del método peligroso.
Configuración de etiquetas permitidas: Configura el campo allowedTags para controlar qué etiquetas pueden pasar. Por defecto, si el contenido es solo texto, no se deberían permitir etiquetas adicionales.
¿Qué considerar para una aplicación segura?
Al implementar esta solución, es fundamental considerar:
Seguridad ante todo: Evitar dejar pasar etiquetas innecesarias, sobre todo scripts o estilos que puedan modificar el layout o funcionalidad de la aplicación.
Flexibilidad controlada: Solo permitir etiquetas si es estrictamente necesario, como en listas o imágenes.
Este enfoque no solo mejora la seguridad y estabilidad de la aplicación sino también su rendimiento y mantenimiento a largo plazo. ¡Sigue explorando y mejorando tus habilidades en React para crear aplicaciones web más seguras y eficientes!
Para instalar los tipos de sanitize y no se queje vscode:
npm i --save-dev @types/sanitize-html
Gracias por el aporte Gerardo!
Al quitar la configuración de allowedTags se vuelve a visualizar la etiqueta <p> y esto es porque la función sanitize la considera una etiqueta permitida de forma predeterminada.
const sanitizedHTML =sanitize(children,{allowedTags:[]});```En cambio al pasar un array vacío a allowedTags estamos especificando que no se permitan ninguna etiqueta HTML en el contenido
npm install -D @types/sanitize-html
ya que sanitize no esta escrito para typscript
Gracias por el aporte Julián!
incluso pueden agregar le el classname para no perder el estilo
a mi me esta fallando por el sanitizer-html. No se por que al profe o le dan estos errores y a mi si, si todo mi codigo es igual.
A mi igual me estaba dando problemas. Me funciono recien instalando ambas librerias, tanto la de JS como la de TS.
npm install sanitize-html
npm install --save-dev @types/sanitize-html
Espero de ayude!
Esto sirve para quitar las etiquetas del HTML, pero no hace render del contenido correctamente en caso de que si queramos mantener dichas etiquetas...
constremoveHtmlTags=(htmlText)=>{return htmlText.replace(/<\/?[^>]+(>|$)/g,'');}<p className="">{removeHtmlTags(product.body_html)}</p>```**Esta fue una solución que se me ocurrió unas clases antes, está bien, o es mejor con la librería?**
Gracias por el regex, si es bien es cierto no es tan escalabre como lo mostrado en el video. me parece mejor opcion para este caso unico en vez de instalar una dependencia
Es mejor usar librerias, ademas de que te permiten modificar tags y establecer reglas personalizadas! he estado trabajando sanitize-html por 2 años y es super facil de manejar!
¿Cómo determinamos qué parte del HTML debemos sanitizar? A lo mejor no estoy entendiendo bien, pero según lo poco que he leído, entiendo que es posible inyectar HTML malicioso en cualquier parte de la página web? Si la respuesta fuera sí, entonces ¿Deberíamos desinfectar todo nuestro HTML?
Excelente clase
Gran tip esta clase. No conocía la librería.
Desde hace varios videos vengo con la sensación que todo se hace sobre la marcha y algunos errores son ignorado, lo cual implica tener que ir a buscar como solventarlos.
Al ser estas clases educativa el contenido debe de ser trasmitido de manera clara no como se está haciendo.