È sicuro usare createHTMLDocument per disinfettare l'HTML?

7

Mi chiedo quanto sia sicuro usare createHTMLDocument per eseguire la sanitizzazione HTML. Ho provato a implementarlo in questo modo:

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

Sembra funzionare bene con tutti gli attacchi XSS che ho lanciato (nessuna valutazione di script o richieste innescate). Ma ho la sensazione che potrebbe essere una cattiva idea, mi manca qualcosa?

Ho creato un jsfiddle se qualcuno vuole sperimentare .

    
posta Mattias Wadman 05.02.2014 - 14:39
fonte

2 risposte

6

Dovresti utilizzare DOMParser per analizzare l'HTML quando disponibile, e solo ricomincia a DOMImplementation.createHTMLDocument se il primo non è disponibile.

In Opera Presto, ho osservato l'attività di rete quando ho passato <img src=...> (ma non <video> ).
Internet Explorer 9- è peggio: media, stili e ascoltatori di eventi saranno attivati con questo metodo. IE10 + supporta DOMParser, quindi se il tuo pubblico utilizza IE10 +, allora sei al sicuro.

    
risposta data 05.02.2014 - 15:31
fonte
2

Il riferimento a innerHTML dell'HTMLElement generato causa mXSS - una sorta di XSS basato su DOM.

ad esempio, il codice seguente causa mXSS in 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;

Pertanto, devi manipolare come HTMLElement, non fare riferimento a innerHTML.

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

vedi link e link

    
risposta data 08.09.2014 - 04:30
fonte

Leggi altre domande sui tag