2011-12-29 17 views
5

Sé que muchas preguntas sobre desinfectantes HTML han aparecido en SO, pero no sé si hacen lo que quiero, tengo un poco lío ya que algunos de los enfoques recomendados tienen más de 4 años.HTML sanitizer en ASP.NET MVC que filtra marcado peligroso, pero permite el resto

Tengo una página con el editor TinyMCE. Por supuesto, este editor envía HTML al servidor y espera HTML, así que he creado una entidad con una propiedad String decorada con el atributo [AllowHtml]. Funciona bien.

Ahora, quiero asegurarme de que nadie intente enviar una etiqueta <script>, o una <img onerror="">, o cualquier forma de ejecutar JS, o agregar CSS que señale a las URL externas.

¿Cuál es la mejor solución en este momento?

WPL tiene HtmlSanitizationLibrary, pero ¿cómo puedo saber qué etiquetas se consideran "seguras"?

WPL no ha lanzado nada desde el pasado mes de abril, y fue la versión beta. Entonces, me preguntaba si este proyecto está activo.

Saludos.

+0

Aún está activo. El Sanitizer sin embargo, bueno, está languideciendo en estos días. A medida que la gente se ha trasladado a XHTML, el desinfectante no está a la altura, y una reescritura no está sobre la mesa. Como TinyMCE produce el marcado XHTML correcto, puedes usar Linq2Xml para consultar el DOM y desinfectarlo a tu gusto. Esa es probablemente una mejor solución a largo plazo (y, mmm, me da una idea para un blog o dos) – blowdart

Respuesta

2

WPL es el estándar de facto. Ejecutar la cadena a través de él y que son seguros para imprimirlo sin codificar:

@Html.Raw(Model.SomePropertyThatWasSanitizedWithWPL) 
+0

Sí, ya uso el método Html.Raw. Pero mi pregunta es, ¿qué etiquetas/atributos están rayados? – vtortola

+0

@vtortola, las etiquetas '

2

AntiXSS/WPL es ahora 'al final de su vida'. Encontrado esta biblioteca en a reply en otra parte:

HtmlSanitizer, una biblioteca .NET para la limpieza de fragmentos de HTML a partir de construcciones que pueden conducir a ataques XSS.

sitio del Proyecto: https://github.com/mganss/HtmlSanitizer

0

Yo probablemente debería ir a dar una lista blanca basada en HTML desinfectante que en realidad entiende documentos HTML. El uso de expresiones regulares generalmente no se considera un enfoque seguro.

El motivo por el cual no se usa AntiXss de Microsoft es que no es posible aplicar reglas más detalladas como qué hacer con las etiquetas. Esto da como resultado que las etiquetas se eliminen completamente cuando, por ejemplo, tendría sentido conservar el contenido de texto. Además, ya no parece mantenerse.

HtmlRuleSanitizer le permite definir una estrategia de saneamiento a coincidir exactamente con el código HTML generado por esperar su editor de la siguiente manera:

var sanitizer = new HtmlSanitizer(); 
sanitizer.Tag("strong").RemoveEmpty(); 
sanitizer.Tag("b").Rename("strong").RemoveEmpty(); 
sanitizer.Tag("i").RemoveEmpty(); 
sanitizer.Tag("a").SetAttribute("target", "_blank") 
    .SetAttribute("rel", "nofollow") 
    .CheckAttribute("href", HtmlSanitizerCheckType.Url) 
    .RemoveEmpty(); 

string cleanHtml = sanitizer.Sanitize(dirtyHtml); 

Use una estrategia de saneamiento predefinido.

Cuestiones relacionadas