No haga esto con expresiones regulares. Recuerde, no está protegiendo solo contra HTML válido; está protegiendo contra el DOM que crean los navegadores web. Los navegadores pueden ser engañados para producir DOM válido a partir de HTML no válido con bastante facilidad.
Por ejemplo, consulte esta lista de obfuscated XSS attacks. ¿Estás preparado para adaptar una expresión regular para evitar este ataque real en el Yahoo and Hotmail en IE6/7/8?
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
¿Qué tal este ataque que funciona en IE6?
<TABLE BACKGROUND="javascript:alert('XSS')">
¿Qué hay de los ataques que no se enumeran en este sitio? El problema con el enfoque de Jeff es que no es una lista blanca, como se dijo. Como alguien con habilidad en that page señala:
El problema con él, es que el html debe estar limpia. Hay casos en que puede pasar en html pirateado, y no coincidirá, en cuyo caso devolverá la cadena html pirateada ya que no coincidirá con nada que reemplazar. Este no está estrictamente incluido en la lista blanca.
Sugeriría una herramienta especialmente diseñada como AntiSamy. Funciona analizando realmente el HTML, y luego recorriendo el DOM y eliminando todo lo que no esté en la lista blanca configurable. La principal diferencia es la capacidad de manejar con gracia HTML mal formado.
La mejor parte es que en realidad las pruebas unitarias de todos los ataques XSS en el sitio anterior. Además, ¿qué podría ser más fácil que esto llamada a la API:
public String toSafeHtml(String html) throws ScanException, PolicyException {
Policy policy = Policy.getInstance(POLICY_FILE);
AntiSamy antiSamy = new AntiSamy();
CleanResults cleanResults = antiSamy.scan(html, policy);
return cleanResults.getCleanHTML().trim();
}
¿Qué más se puede pedir? Las respuestas se ven bien para mí. –