2011-10-12 6 views
14

Quali sono alcuni casi d'uso e se è deprecato? Come ho scoperto in http://groups.google.com/group/envjs/browse_thread/thread/6c22d0f959666009/c389fc11537f2a97 che è "non-standard e non supportata da qualsiasi browser moderno" ...Cosa usare document.implementation.createHTMLDocument?

EDIT:

Chi document.implementation a http://javascript.gakaa.com/document-implementation.aspx:

restituisce un riferimento l'oggetto W3C DOMImplementation, che rappresenta, in misura limitata, l'ambiente che costituisce il documento contenente il browser, per i nostri scopi. I metodi dell'oggetto consentono di vedere quali moduli DOM sono supportati dai rapporti del browser. Questo oggetto è anche un gateway per la creazione di documenti W3C virtuali e oggetti DocumentType al di fuori della struttura del documento corrente. Pertanto, in Netscape 6 è possibile utilizzare la proprietà document.implementation come inizio per generare un documento non restituito per documenti XML esterni. Vedere l'oggetto DOMImplementation per i dettagli sui metodi e il loro supporto per il browser .

dato che fornisce i metodi (come ad esempio createHTMLDocument) per la creazione di un documento nonrendered al di fuori del documento corrente, sarebbe sicuro per la sua alimentazione non attendibile di terze parti di input HTML che può contenere un po 'XSS? Chiedo perché mi piacerebbe utilizzare createHTMLDocument per scopi trasversali di input HTML di terze parti. Potrebbe essere uno dei casi d'uso?

+1

Secondo [QuirksMode] (http://www.quirksmode.org/dom/w3c_html.html), 'createHTMLDocument' non era disponibile in vecchie versioni di IE o Firefox. A quanto pare, IE9 lo supporta e il mio test dimostra che FF7 lo supporta. – lonesomeday

+1

E ['createHTMLDocument' è nella specifica DOM2] (http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1019015399) – lonesomeday

risposta

12

io uso sempre questo perché non fa richieste alle immagini, eseguire script o influenzare lo styling:

function cleanHTML(html) { 
    var root = document.implementation.createHTMLDocument().body; 

    root.innerHTML = html; 

    //Manipulate the DOM here 
    $(root).find("script, style, img").remove(); //jQuery is not relevant, I just didn't want to write exhausting boilerplate code just to make a point 

    return root.innerHTML; 
} 


cleanHTML('<div>hello</div><img src="google"><script>alert("hello");</script><style type="text/css">body {display: none !important;}</style>'); 
//returns "<div>hello</div>" with the page unaffected 
+5

codice boiler esaurimento = '[] .forEach.call (document.querySelectorAll (" script, style, img "), function (el) {el.remove();});' – Greg

9

Sì. È possibile utilizzarlo per caricare contenuti di terze parti non attendibili e rimuoverli da tag e attributi pericolosi prima di includerli nel proprio documento. C'è qualche grande ricerca che incorpora questo trucco, descritto a http://blog.kotowicz.net/2011/10/sad-state-of-dom-security-or-how-we-all.html.

La tecnica documentata da Esailija sopra è tuttavia insufficiente. Devi anche rimuovere la maggior parte degli attributi. Un utente malintenzionato può impostare un elemento onerror o onmouseover su JS dannoso. L'attributo style può essere usato per includere CSS che esegue JS dannoso. Anche Iframe e altri tag embed possono essere utilizzati. Visualizza la sorgente a https://html5sec.org/xssme/xssme2 per vedere una versione di questa tecnica.

+0

[Secondo link] (http: //xssme.html5sec. org/xssme2) è rotto.Sarebbe stato interessante vedere – jscripter

+0

Penso che questa sia una copia dello stesso codice: https://html5sec.org/xssme/xssme2. Aggiornamento della risposta per indicare lì. L'URL originale era http://xssme.html5sec.org/xssme2 – jsha

1

Basta una risposta più pulita oltre risposte @Esailija e @ Greg: Questa funzione creerà un altro documento al di fuori della struttura di documento corrente, e pulire tutti gli script, gli stili e le immagini del nuovo documento:

function insertDocument (myHTML) { 
    var newHTMLDocument = document.implementation.createHTMLDocument().body; 
    newHTMLDocument.innerHTML = myHTML; 
    [].forEach.call(newHTMLDocument.querySelectorAll("script, style, img"), function(el) {el.remove(); }); 
    documentsList.push(newHTMLDocument); 
    return $(newHTMLDocument.innerHTML); 
} 

Questo è fantastico per fare richieste Ajax e raschiare il contenuto sarà più veloce :)