2011-10-12 18 views
14

Bazı kullanım durumları ve kullanımdan kaldırılmış olup olmadığı nedir? Ben "standart dışı ve herhangi bir modern tarayıcı tarafından desteklenmiyor" olduğunu http://groups.google.com/group/envjs/browse_thread/thread/6c22d0f959666009/c389fc11537f2a97 ... en öğrendim gibidocument.implementation.createHTMLDocument'i kullanmak için ne gerekir?

DÜZENLEME:

Hakkında document.implementationhttp://javascript.gakaa.com/document-implementation.aspx at:

bir başvuru döndürür 'un belgesini temsil eden W3C DOMImplementation nesnesinin amacı, bizim amacımız için belgesini oluşturan ortamı içerir. Nesnenin yöntemleri, tarayıcının desteklediği raporların DOM modüllerini görmenizi sağlar. Bu nesnesi, geçerli belge ağacının dışında sanal W3C Belgesi ve DocumentType nesneleri oluşturmaya yönelik bir ağ geçididir. Bu nedenle, Netscape 6 belgesinde document.implementation özelliğini, dış XML belgeleri için oluşturulmamış bir belge oluşturmak üzere bir başlangıç ​​ olarak kullanabilirsiniz. Yöntemler ve bunların tarayıcı desteği ile ilgili ayrıntılar için DOMImplementation nesnesine bakın.

geçerli belge ağacının dışında bir nonrendered belge oluşturmak için (örneğin createHTMLDocument gibi) yöntemler sağlar düşünüldüğünde, onu bazı XSS ​​içerebilir güvenilmeyen üçüncü taraf HTML giriş beslemek için güvenli olurdu? Soruyorum çünkü üçüncü taraf HTML girişinin çapraz amaçları için createHTMLDocument kullanmak istiyorum. Kullanım durumlarından biri olabilir mi?

+1

[QuirksMode] 'a göre (http://www.quirksmode.org/dom/w3c_html.html),' createHTMLDocument 'özelliği mevcut değildi. IE veya Firefox'un eski sürümleri. IE9 görünüşe göre bunu destekliyor ve kendi testlerim FF7'nin bunu desteklediğini gösteriyor. – lonesomeday

+1

Ve ['createHTMLDocument ', DOM2 özelliğindedir] (http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1019015399) – lonesomeday

cevap

12

Hep, resimlere istekte komut dosyalarını yürütmek veya stil etkilemez çünkü bu kullanın:

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

Yardımcı araç kodu = "[] .forEach.call (document.querySelectorAll (" komut dosyası, stil, img "), function (el) {el.remove();}); – Greg

9

Evet. Güvenilmeyen üçüncü taraf içerikleri yüklemek ve onu kendi belgenize eklemeden önce tehlikeli etiketlerden ve özniteliklerden ayırmak için bunu kullanabilirsiniz. http://blog.kotowicz.net/2011/10/sad-state-of-dom-security-or-how-we-all.html'da açıklanan bu hileyi içeren bazı büyük araştırmalar var. Bununla birlikte, Esailija tarafından belgelenen teknik, ancak yetersizdir. Ayrıca, çoğu özniteliği çıkarmanız gerekir. Bir saldırgan, zararlı JS'ye karşı bir hata veya tam bir öğe ayarlayabilir. Stil özniteliği, kötü amaçlı JS çalıştıran CSS'yi içermek için kullanılabilir. Iframe ve diğer yerleştirme etiketleri de kötüye kullanılabilir. Bu tekniğin bir sürümünü görmek için kaynağı https://html5sec.org/xssme/xssme2 adresinden görüntüleyebilirsiniz. @Esailija ve @Greg cevapları yanında

+0

[İkinci bağlantı] (http: //xssme.html5sec. org/xssme2) bozuk. – jscripter

+0

'u görmek ilginç olurdu. Aynı kodun bir kopyası: https://html5sec.org/xssme/xssme2. Cevabın oraya işaret edilmesi. Orijinal URL http://xssme.html5sec.org/xssme2 idi – jsha

1

Sadece bir temizleyici cevap:

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

: Bu fonksiyon geçerli belgenin ağacının dışında başka bir belge oluşturmak ve yeni belgeden temiz tüm komut dosyaları, stiller ve resimler Bu ajax istekleri yapmak için harika ve içeriği daha hızlı olacaktır.

İlgili konular