site script salvaguardas prevención para fallas example evitar cross ataques ataque java html sanitization xss

script - ¿Cómo desinfectar el código HTML en Java para evitar ataques XSS?



salvaguardas para cross site scripting (5)

Con respecto a Antisamy, puede que desee verificar esto con respecto a las dependencias:

http://code.google.com/p/owaspantisamy/issues/detail?id=95&can=1&q=redyetidave

Estoy buscando una clase / utilidad, etc. para desinfectar el código HTML, es decir, eliminar etiquetas, atributos y valores peligrosos para evitar XSS y ataques similares.

Obtengo el código html del editor de texto enriquecido (por ejemplo, TinyMCE) pero se puede enviar de forma malintencionada, omitiendo la validación de TinyMCE ("Los datos enviados de forma externa")

¿Hay algo tan simple de usar como InputFilter en PHP? La solución perfecta que puedo imaginar funciona así (asuma que el desinfectante está encapsulado 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! Lo mejor para mí sería una clase util pequeña con tan pocas dependencias externas de otras bibliotecas / marcos como sea posible.

¿Qué hay sobre eso?


Gracias a la answer de @Saljack. Solo para elaborar más sobre 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>

Compruebe here para el último lanzamiento.

Luego agregué esta función para el saneamiento:

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); }

Se pueden agregar más etiquetas al extender el parámetro delimitado por comas en el método allowElements.

Solo agregue esta línea antes de pasar el bean para guardar los datos:

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

¡Eso es!

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


Las entradas de escape HTML funcionan muy bien. Pero en algunos casos, las reglas de negocios pueden requerir que NO se escape del HTML. Usar REGEX no es apropiado para la tarea y es muy difícil encontrar una buena solución al usarlo.

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

Construye un árbol DOM con la entrada provista y filtra cualquier elemento no permitido previamente por una lista blanca. La API también tiene otras funciones para limpiar html.

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


Puede probar 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);


Podría usar OWASP ESAPI para Java , que es una biblioteca de seguridad creada para realizar tales operaciones.

No solo tiene codificadores para HTML, también tiene codificadores para realizar codificación de JavaScript, CSS y URL. Ejemplos de usos de ESAPI se pueden encontrar en la hoja de trucos de prevención XSS publicada por OWASP.

Puede usar el proyecto OWASP AntiSamy para definir una política de sitio que indique lo que está permitido en el contenido enviado por el usuario. La política del sitio se puede usar más adelante para obtener el HTML "limpio" que se muestra nuevamente. Puede encontrar un archivo de política de TinyMCE de muestra en la página de descargas de AntiSamy .