Подтвердить что ты не робот

Зачем использовать document.implementation.createHTMLDocument?

Каковы некоторые варианты использования и устарели ли они? Как я узнал в http://groups.google.com/group/envjs/browse_thread/thread/6c22d0f959666009/c389fc11537f2a97, что он "нестандартен и не поддерживается каким-либо современным браузером"...

EDIT:

О document.implementation в http://javascript.gakaa.com/document-implementation.aspx:

Возвращает ссылку на объект W3C DOMImplementation, который представляет в ограниченной степени среду, которая составляет документ содержит браузер, для наших целей. Методы объекта вы увидите, какие модули DOM поддерживают браузеры. Эта объект также является шлюзом для создания виртуального документа W3C и Объекты DocumentType за пределами текущего дерева документов. Таким образом, в Netscape 6 вы можете использовать свойство document.implementation как начало для генерации неназначенного документа для внешних XML-документов. Видеть объект DOMImplementation для подробностей о методах и их поддержка браузера.

Учитывая, что он предоставляет методы (например, createHTMLDocument) для создания незаписанного документа за пределами текущего дерева документов, было бы безопасным подавать его недоверенный сторонний ввод HTML, который может содержать некоторый XSS? Я прошу, потому что я хотел бы использовать createHTMLDocument для обхода стороннего входа в формате HTML. Может быть, это один из вариантов использования?

4b9b3361

Ответ 1

Я всегда использую это, потому что он не делает запросы к изображениям, выполняет сценарии или влияет на стиль:

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

Ответ 2

Да. Вы можете использовать это, чтобы загрузить недоверенный сторонний контент и разделить его на опасные теги и атрибуты, прежде чем включать его в свой собственный документ. Существует несколько замечательных исследований, включающих этот трюк, описанный в http://blog.kotowicz.net/2011/10/sad-state-of-dom-security-or-how-we-all.html.

Однако техника, описанная выше Esailija, недостаточна. Вам также нужно удалить большинство атрибутов. Злоумышленник может установить элемент onerror или onmouseover для злонамеренного JS. Атрибут стиля может использоваться для включения CSS, который запускает вредоносный JS. Также можно злоупотреблять iframe и другими тегами встраивания. Просмотрите версию https://html5sec.org/xssme/xssme2, чтобы увидеть версию этой техники.

Ответ 3

Только более чистый ответ, помимо @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 и соскабливать контент быстрее:)