¿Es seguro usar createHTMLDocument para sanear HTML?

7

Me pregunto qué tan seguro es usar createHTMLDocument para realizar el saneamiento de HTML. He intentado implementarlo de esta manera:

function sanitize(string) {
  var elm = document.implementation.createHTMLDocument().body;
  elm.innerHTML = string;
  // traverse and filter elm to only allow whitelisted elements and attributes
  // e.g. use https://github.com/gbirke/Sanitize.js
  var cleaned_fragment = whitelist_filter(elm);
  elm = document.implementation.createHTMLDocument().body;
  elm.appendChild(cleaned_fragment);

  return elm.innerHTML;
}

Parece que funciona bien con todos los ataques XSS que he lanzado (no se ha realizado ninguna evaluación de script ni se han activado solicitudes). Pero tengo la sensación de que podría ser una mala idea, ¿me estoy perdiendo algo?

He creado un jsfiddle si alguien quiere experimentar .

    
pregunta Mattias Wadman 05.02.2014 - 14:39
fuente

2 respuestas

6

Debería usar DOMParser para analizar HTML cuando esté disponible, y solo retroceda a DOMImplementation.createHTMLDocument si el primero no está disponible.

En Opera Presto, observé la actividad de la red cuando pasé <img src=...> (pero no <video> ).
Internet Explorer 9 es peor: los medios, estilos y escuchas de eventos se activarán con este método. IE10 + es compatible con DOMParser, por lo tanto, si su audiencia usa IE10 +, entonces estará seguro.

    
respondido por el Rob W 05.02.2014 - 15:31
fuente
2

La referencia a innerHTML de HTMLElement generado causa mXSS, un tipo de XSS basado en DOM.

por ejemplo, el siguiente código causa mXSS en IE.

var s = "<listing>&lt;img src=1 onerror=alert(1)&gt;</listing>";
var parser = new DOMParser();
var doc = parser.parseFromString( s, "text/html" );
div.innerHTML = doc.body.innerHTML;

por lo tanto, tiene que manipular como HTMLElement, no haga referencia a innerHTML.

div.appendChild( doc.body.childNodes[ 0 ] );

vea enlace y enlace

    
respondido por el HASEGAWA Yosuke 08.09.2014 - 04:30
fuente

Lea otras preguntas en las etiquetas