2011-10-12 11 views
14

कुछ उपयोग के मामले क्या हैं और क्या इसे बहिष्कृत किया गया है? जैसा कि मैंने http://groups.google.com/group/envjs/browse_thread/thread/6c22d0f959666009/c389fc11537f2a97 कि यह "गैर मानक और किसी भी आधुनिक ब्राउज़र द्वारा समर्थित नहीं" ... पर पता चलादस्तावेज़.implementation.createHTML दस्तावेज़ का उपयोग करने के लिए क्या?

संपादित करें:

बारे document.implementationhttp://javascript.gakaa.com/document-implementation.aspx पर:

के लिए संदर्भ लौटाता W3C DOMImplementation ऑब्जेक्ट, जो सीमित उद्देश्यों के लिए प्रतिनिधित्व करता है, पर्यावरण जो हमारे उद्देश्यों के लिए दस्तावेज़ कंटेनर ब्राउज़र बनाता है। ऑब्जेक्ट के तरीके आपको यह देखने देता है कि कौन से डोम मॉड्यूल ब्राउज़र रिपोर्ट का समर्थन करता है। यह ऑब्जेक्ट वर्चुअल W3C दस्तावेज़ और दस्तावेज़ दस्तावेज़ टाइप करने के लिए वर्तमान दस्तावेज़ पेड़ के बाहर भी गेटवे है। इस प्रकार, नेटस्केप 6 में आप बाहरी XML दस्तावेज़ों के लिए एक गैर-प्रेषित दस्तावेज़ उत्पन्न करने के लिए प्रारंभ के रूप में दस्तावेज़। कार्यान्वयन गुण का उपयोग कर सकते हैं। विधियों और उनके ब्राउज़र समर्थन के बारे में विवरण के लिए DOMImplementation ऑब्जेक्ट देखें।

यह देखते हुए कि यह वर्तमान दस्तावेज़ पेड़ के बाहर एक nonrendered दस्तावेज़ बनाने के लिए (जैसे createHTMLDocument के रूप में) के तरीकों प्रदान करता है, यह अविश्वसनीय तीसरे पक्ष के HTML इनपुट है कि कुछ XSS हो सकती है खिलाने के लिए सुरक्षित हो सकता है? मैं पूछता हूं क्योंकि मैं तृतीय पक्ष HTML इनपुट के ट्रैवर्सल उद्देश्यों के लिए createHTMLDocument का उपयोग करना चाहता हूं। क्या यह उपयोग मामलों में से एक हो सकता है?

+1

[QuirksMode] (http://www.quirksmode.org/dom/w3c_html.html) के अनुसार, 'createHTMLDocument' में उपलब्ध नहीं था आईई या फ़ायरफ़ॉक्स के पुराने संस्करण। आईई 9 स्पष्ट रूप से इसका समर्थन करता है, और मेरा स्वयं का परीक्षण दर्शाता है कि एफएफ 7 इसका समर्थन करता है। – lonesomeday

+1

और ['createHTMLDocument' DOM2 spec में है] (http://www.w3.org/TR/2000/CR-DOM-Level-2-20000510/html.html#ID-1019015399) – lonesomeday

उत्तर

12

मैं हमेशा इस उपयोग करें, क्योंकि यह, छवियों के लिए अनुरोध नहीं कर सकता आलेख निष्पादित या स्टाइल प्रभावित करते हैं:

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

बॉयलरप्लेट कोड को निकालने = '[] .forEach.call (document.querySelectorAll (" स्क्रिप्ट, शैली, आईएमजी "), फ़ंक्शन (एल) {el.remove();});' – Greg

9

हां। आप अविश्वसनीय तृतीय-पक्ष सामग्री को लोड करने के लिए इसका उपयोग कर सकते हैं और इसे अपने दस्तावेज़ में शामिल करने से पहले खतरनाक टैग और विशेषताओं को पट्टी कर सकते हैं। http://blog.kotowicz.net/2011/10/sad-state-of-dom-security-or-how-we-all.html पर वर्णित इस चाल को शामिल करने वाला कुछ शानदार शोध है।

उपरोक्त Esailija द्वारा प्रलेखित तकनीक अपर्याप्त है, हालांकि। आपको अधिकतर विशेषताओं को अलग करने की भी आवश्यकता है। एक हमलावर दुर्भावनापूर्ण जेएस पर एक आतंक या onmouseover तत्व सेट कर सकता है। शैली विशेषता का उपयोग सीएसएस को शामिल करने के लिए किया जा सकता है जो दुर्भावनापूर्ण जेएस चलाता है। इफ्रेम और अन्य एम्बेड टैग का भी दुरुपयोग किया जा सकता है। इस तकनीक का एक संस्करण देखने के लिए https://html5sec.org/xssme/xssme2 पर स्रोत देखें।

+0

[दूसरा लिंक] (http: //xssme.html5sec। संगठन/xssme2) टूटा हुआ है।यह – jscripter

+0

देखने में दिलचस्प रहा होगा मुझे लगता है कि यह एक ही कोड की एक प्रति है: https://html5sec.org/xssme/xssme2। वहां इंगित करने के लिए उत्तर अद्यतन कर रहा है। मूल यूआरएल http://xssme.html5sec.org/xssme2 था – jsha

1

बस @Esailija और @Greg जवाब के अलावा एक क्लीनर जवाब:

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

: इस समारोह वर्तमान दस्तावेज़ की पेड़ के बाहर किसी अन्य दस्तावेज़ पैदा करेगा, और स्वच्छ सभी लिपियों, नया दस्तावेज़ से शैलियों और छवियों यह AJAX अनुरोध बनाने और सामग्री को स्क्रैप करने के लिए शानदार है तेज़ होगा :)

संबंधित मुद्दे

 संबंधित मुद्दे