Desinfección X / HTML y CSS basada en JavaScript
Antes de que todos me digan que no debería hacer la desinfección del lado del cliente (de hecho, tengo la intención de hacerlo en un cliente, aunque también podría funcionar en SSJS), déjenme aclarar lo que estoy tratando de hacer.
Me gustaría algo similar aGoogle Caja o HTMLPurifier pero para JavaScript: un enfoque de seguridad basado en la lista blanca que procesa HTML y CSS (no insertado en el DOM, por supuesto, que no sería seguro, pero primero se obtiene en forma de cadena) y luego filtra selectivamente las etiquetas o atributos inseguros, ignorando ellos u opcionalmente incluyéndolos como texto escapado o permitiendo que sean reportados a la aplicación para su posterior procesamiento, idealmente en contexto. Sería genial si pudiera reducir cualquier JavaScript a un subconjunto seguro también, como en Google Caja, pero sé que sería mucho pedir.
Mi caso de uso es acceder a datos XML / XHTML no confiables obtenidos a través de JSONP (datos de wikis de Mediawiki antes del procesamiento de wiki, lo que permite una entrada XML / HTML sin procesar pero no confiable) y permite al usuario realizar consultas y transformaciones sobre esos datos (XQuery, jQuery, XSLT, etc.), aprovechando HTML5 para permitir uso sin conexión, almacenamiento IndexedDB, etc., y que luego puede permitir que los resultados se previsualicen en la misma página donde el usuario ha visto la fuente de entrada y ha creado o importado sus consultas.
El usuario puede producir cualquier salida que desee, por lo que no sanearé lo que está haciendo; si quieren inyectar JavaScript en la página, todo el poder para ellos. Pero sí quiero proteger a los usuarios que desean tener la confianza de que pueden agregar código que copia de forma segura sobre elementos específicos de la entrada no confiable, al tiempo que les impide copiar entradas inseguras.
Esto definitivamente debería ser factible, pero me pregunto si hay bibliotecas que ya lo hagan.
Y si estoy atascado implementando esto por mi cuenta (aunque tengo curiosidad en cualquier caso), me gustaría tener pruebas sobre si usarinnerHTML
o la creación / adición de DOM ANTES de que la inserción en el documento sea segura en todos los sentidos. Por ejemplo, ¿se pueden activar accidentalmente los eventos si ejecutéDOMParser
o se basó en el análisis HTML del navegador utilizandoinnerHTML
para agregar HTML sin formato a un div no insertado? Creo que debería ser seguro, pero no estoy seguro de si los eventos de manipulación DOM podrían ocurrir de alguna manera antes de la inserción que podrían explotarse.
Por supuesto, el DOM construido necesitaría desinfectarse después de ese punto, pero solo quiero verificar que puedo construir de manera segura el propio objeto DOM para un recorrido más fácil y luego preocuparme por filtrar elementos, atributos y valores de atributo no deseados.
¡Gracias