2012-08-16 12 views
10

Estoy buscando un buen desinfectante HTML para usar en un proyecto ASP.NET. El inconveniente es que el desinfectante debe admitir atributos de estilo, que pueden contener propiedades de CSS, que también deben ser desinfectadas. Hasta ahora no he podido encontrar un buen producto para usar. Antes de morder la bala y escribir mi propio desinfectante, pensé que podría tratar de ver lo que la gente aquí está usando primero.HTML Sanitizer for .NET que admite etiquetas de estilo

bibliotecas que he mirado y rechazadas:

  • AntiXSS Biblioteca (versión antigua es insegura, nuevas etiquetas de estilo tiras versión)
  • AntiSamy .NET (sin mantenimiento, carece de características necesarias en .NET versión, tiene dependencias obsoletas)
  • El HTMLAgilityPackSanitizer en AjaxControlToolkit (escapa etiquetas de estilo)

Lo ideal sería tener una lista blanca sanitizante basado en tha t también valida valores de propiedad contra una lista de valores conocidos o expresiones regulares.

¿Alguien capaz de apuntarme en la dirección correcta?

+0

[HTML Tidy] (http://tidy.sourceforge.net/) es viejo, pero lo he usado con éxito. – transistor1

+0

No estoy seguro de que sea lo que estoy buscando, sin embargo. El objetivo principal aquí es garantizar que la entrada del usuario no contenga scripts ejecutables. HTML Tidy se ve bien, pero parece tener un propósito muy diferente. –

Respuesta

0

Tatham Oddie ASP.Net MVP - http://blog.tatham.oddie.com.au/2009/06/15/released-xhtml-markup-sanitizer/

he referido esto a unas pocas personas ahora. No puede hacer todo lo que quiere, pero un codificador impresionante de Tatham por lo que debería darle un montón de ideas ...

Justo en el AntiXSS, que yo sepa la nueva versión está en HTMLAgilityPackSanitizer

+0

Gracias, pero ninguno de esos es adecuado para mis propósitos, ya que ambos codifican caracteres especiales dentro de los atributos. Esto es bueno para la seguridad porque hay muchos hacks XSS que puedes hacer en un atributo de estilo, pero necesito poder permitir lo bueno. :-( –

3

Mira CsQuery (que yo soy el autor principal de) como una herramienta para manipular HTML.

Este es un puerto .NET jQuery, le proporciona acceso completo a HTML a través de los mismos métodos que usaría en el cliente (un DOM y API de jQuery). Esto hace que sea bastante fácil rodar su propio desinfectante.

Rick Strahl tuvo un blog post recientemente sobre la desinfección de HTML. Mostró cómo hacerlo con sus reglas usando HTML Agility Pack, publiqué un comentario que muestra cómo lograr lo mismo más fácilmente con CsQuery. Los fundamentos son sólo esto, dada una enumeración de las etiquetas BlackList:

CQ doc = CQ.Create(html); 

// creates a grouped selector "iframe,form,script, ..." 
string selector = String.Join(",",BlackList); 

// CsQuery uses the property indexer as a default method, it's identical 
// to the "Select" method and functions like $(...) 

doc[selector].Remove(); 

Si no desea eliminar el contenido realidad en algunas etiquetas, por ejemplo, quizás formateando las etiquetas que desea prohibir, puede usar desenvolver de jQuery. Esto tendría el efecto de eliminar una etiqueta pero preservar sus hijos.

doc[selector].UnWrap(); 

Cuando haya terminado:

string cleanHtml = doc.Render(); 

Hay más en el puesto de Ricks para la limpieza de javascript atributos de los eventos y así sucesivamente, pero básicamente CsQuery es una caja de herramientas con una forma familiar y fácil de manipular HTML. Debería ser lo suficientemente fácil crear un desinfectante que funcione de la manera que desee.

El modelo de DOM de CsQuery también contiene métodos para acceder a los estilos directamente (por ejemplo, de una manera más conveniente que simplemente manipular la cadena), si necesita hacer algo como eliminar ciertos estilos con nombre.Por ejemplo, podría quitar el estilo "font-weight" de todos los elementos:

// use the [attribute] selector to target only elements with styles 

foreach (IDomObject element in doc["[style]"]) { 
    if (element.HasStyle("font-weight")) { 
     element.RemoveStyle("font-weight"); 
    } 
} 

El principal inconveniente de CsQuery en este momento es la documentación. Su API está diseñada para coincidir lo más posible con el navegador DOM y jQuery (teniendo en cuenta las diferencias de idioma entre jQuery y C#), y la API pública está bien comentada, por lo que debería ser fácil codificar contra una vez que empiece.

Pero hay un puñado de métodos no estándar (como "HasStyle" y "RemoveStyle" que) son exclusivos de CsQuery. Sin embargo, el uso básico está cubierto bastante bien en el archivo léame en github. También está en Nuget como CsQuery.

+0

Cool. Si termino rodar mi propio desinfectante, parece una buena herramienta para mirar. –

+0

Voy a probar esto y hacer mi propio desinfectante de lista blanca. Estoy asumiendo que puedo simplemente usar un selector "all" y luego iterar y desenvolver cualquiera que no esté en mi lista blanca (¿o utilizar un selector que no sea predicado, si existen?) – Schneider

+0

No puedo pensar en una razón que no funcione. No tengo un buen sentido de si eso sería más o menos eficiente que utilizar el selector de etiquetas para solo apuntar a las etiquetas que desea en primer lugar (la misma técnica que el ejemplo de la lista negra que doy), probablemente dependería de la relación de bueno a malo, pero para para este propósito, probablemente sea una cantidad tan pequeña de contenido que realmente no importaría de ninguna manera. –

0

Intente mirar el HtmlSanitizer publicado en el blog de laboratorio abierto: http://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/. Éste es compatible con etiquetas de estilo y es bastante bueno para usar para editores html.

+0

Gracias. Es lo más parecido que he visto, pero no soy partidario del enfoque de la lista negra. Por ejemplo, no considera que el "comportamiento" sea una cadena prohibida en los atributos de estilo, aunque puede ejecutar scripts en IE a través de comportamientos. Probablemente hay otras cosas que puede hacer que yo y el autor no sabemos. También me preocupa que no analice HTML correctamente. Todavía puede funcionar, pero si puede engañar al analizador (por ejemplo, poner un carácter ">" en un valor de atributo, considerará que la etiqueta está cerrada), entonces puede engañar al sanitizador. –

+0

Como no pude editar mi comentario, lo reescribí: bueno, en ese caso, no creo que haya otro camino aparte de elegir una biblioteca como base y personalizarla según sus necesidades. Puede ser un poco de trabajo, pero esa es la única forma en que realmente obtienes lo que quieres. Hicimos lo mismo en el trabajo (lamentablemente no puedo compartir ese código). – Rutix

+0

Sí, eso es lo que terminé haciendo. Solo esperaba que hubiera una mejor manera. –

4

Probar this native .NET HTML Sanitizer project. Puede comprender los atributos de estilo como desee (aunque no intenta preservar las etiquetas STYLE, simplemente las elimina).

Además, está basado en la lista blanca, en lugar de la lista negra (y usa AngleSharp en lugar de CsQuery, que ahora está en desuso). ¡También es on Nuget!