2010-08-05 57 views
19

Estoy buscando clases/utilidades, etc. para desinfectar el código HTML, es decir, eliminar etiquetas peligrosas, atributos y valores para evitar ataques XSS y similares.¿Cómo desinfectar el código HTML en Java para prevenir los ataques XSS?

Obtengo el código html del editor de texto enriquecido (por ejemplo, TinyMCE) pero puede enviarse de manera maliciosa, omitiendo la validación de TinyMCE ("Los datos enviados se envían fuera del sitio").

¿Hay algo tan simple de usar como InputFilter en PHP? La solución perfecta me puedo imaginar que obras como (asumir desinfectante se encapsula en la clase HtmlSanitizer):

String unsanitized = "...<...>...";   // some potentially 
               // dangerous html here on input 

HtmlSanitizer sat = new HtmlSanitizer();  // sanitizer util class created 

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe... 

actualización - la solución más simple, mejor! Una pequeña clase de utilidades con tan pocas dependencias externas en otras bibliotecas/frameworks como sea posible - sería lo mejor para mí.


¿Qué tal eso?

+0

Lo que básicamente quiere es que los clientes puedan enviar formularios que luego se muestran en forma de fx. un libro de visitas? ¿Y desea que puedan usar html pero aún desea poder bloquear intentos maliciosos de piratería de usuarios? ¿O lo entendí mal aquí ...? – Latze

+0

@Latze: Deseo que los clientes (usuarios a través de sus navegadores) envíen contenido enriquecido (formato html a través del editor de texto enriquecido - TinyMCE) pero para verificar y eliminar cualquier contenido potencialmente peligroso (inseguro). No sé qué es el fx y el libro de visitas que mencionas en este contexto. – WildWezyr

+0

¡Ah! Voy a darle una oportunidad, dame un par de minutos – Latze

Respuesta

12

Puede usar OWASP ESAPI for Java, que es una biblioteca de seguridad creada para realizar tales operaciones.

No solo tiene codificadores para HTML, también tiene codificadores para realizar JavaScript, CSS y codificación URL. Sample uses of ESAPI se puede encontrar en la hoja de prueba de prevención XSS publicada por OWASP.

Puede usar el proyecto OWASP AntiSamy para definir una política de sitio que establezca lo que está permitido en el contenido enviado por el usuario. La política del sitio puede usarse posteriormente para obtener HTML "limpio" que se muestra de nuevo. Puede encontrar una muestra TinyMCE policy file en el AntiSamy downloads page.

+0

que esto requeriría para reconstruir la arquitectura de todo mi proyecto. No estoy dispuesto a hacerlo. Necesito algo simple sin muchas dependencias y sin necesidad de cambiar la forma en que está organizado mi código (me gusta como está ahora). Entonces, necesito solo una clase de utilidades para hacer el trabajo. mi pregunta ahora está actualizada para aclarar ese requisito. – WildWezyr

+2

No estoy seguro de lo que quiere decir con la reconstrucción de la arquitectura del proyecto. AntiSamy se adapta perfectamente a sus necesidades al permitir que las entradas del editor de texto se introduzcan en una biblioteca de filtrado impulsada por una política del sitio. –

+0

Hmmm. ¡Parece que tienes razón! Solo pensé que era un armazón grande y pesado como puntales, resortes, etc. y funciona como un tipo de filtro servlet ;-). Probablemente las letras grandes en el nombre ("OWASP") me confundieron aquí. Por cierto: ¿cuáles son las dependencias exactas de OWASP AntiSamy? ¿Qué más necesitaré para usarlo? – WildWezyr

6

HTML escapar entradas funciona muy bien. Pero en algunos casos, las reglas comerciales pueden requerir que NO escape del HTML. Usar REGEX no es adecuado para la tarea y es muy difícil encontrar una buena solución para usarlo.

La mejor solución que encontré fue utilizar: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

Se construye un árbol DOM con las aportaciones y los filtros de cualquier elemento no permitido Anteriormente: por una lista blanca. La API también tiene otras funciones para limpiar html.

Y también se puede utilizar con @SafeHtml javax.validation (= whitelistType, additionalTags =)

9

Usted puede intentar OWASP Java HTML Sanitizer. Es muy facíl de usar.

PolicyFactory policy = new HtmlPolicyBuilder() 
    .allowElements("a") 
    .allowUrlProtocols("https") 
    .allowAttributes("href").onElements("a") 
    .requireRelNofollowOnLinks() 
    .build(); 

String safeHTML = policy.sanitize(untrustedHTML); 
3

Gracias a @ Saljack's answer. Solo para elaborar más a OWASP Java HTML Sanitizer. Funcionó muy bien (rápido) para mí. Acabo de agregar lo siguiente al pom.xml en mi proyecto Maven:

<dependency> 
     <groupId>com.googlecode.owasp-java-html-sanitizer</groupId> 
     <artifactId>owasp-java-html-sanitizer</artifactId> 
     <version>20150501.1</version> 
    </dependency> 

Comprobar here para la versión más reciente.

Luego añade esta función para la desinfección:

private String sanitizeHTML(String untrustedHTML){ 
     PolicyFactory policy = new HtmlPolicyBuilder() 
      .allowAttributes("src").onElements("img") 
      .allowAttributes("href").onElements("a") 
      .allowStandardUrlProtocols() 
      .allowElements(
      "a", "img" 
      ).toFactory(); 

     return policy.sanitize(untrustedHTML); 
    } 

más etiquetas se pueden añadir mediante la extensión del parámetro delimitado por comas en el método allowElements.

Sólo tiene que añadir esta línea antes de pasar el grano para ahorrar los datos:

bean.setHtml(sanitizeHTML(bean.getHtml())); 

eso es todo!

Para una lógica más compleja, esta biblioteca es muy flexible y puede manejar una implementación de sanitización más sofisticada.

Cuestiones relacionadas