Как да използвам nsIParserUtils в firefox addon sdk 1.10 main.js?

Скорошното ми изпращане за сайт за добавки за Firefox (базиран на Firefox Add-on SDK 1.10) беше отхвърлено, защото не съм дезинфекцирал входа, който използвам, и ми беше предложено да използвайте nsIParserUtils.

Намерих функцията parseHTML(doc, html, allowStyle, baseURI, isXML) на тази страница. Промених го на:

function parseHTML(doc, html, allowStyle, baseURI, isXML) {
    var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
    var f =  parser.parseFragment(html, allowStyle ? parser.SanitizerAllowStyle : 0,
                                        !!isXML, baseURI, doc);
    return f;
}

И първият параметър в това се казва, че е елемент на документ. Нямам представа какво трябва да е това? Опитах document.createDocumentFragment(), но получавам грешка „ReferenceError: документът не е дефиниран“. Може ли някой да ми помогне как да извикам тази функция?

И функцията връща nsIDOMDocumentFragment. Как да го преобразувам обратно в низ?


АКТУАЛИЗАЦИЯ:

Както беше предложено от @zer0, използвах:

var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var sanitizedHTML = parser.sanitize(html, flags);

Но това проваля целта на това, което исках да направя. Например:

<html><head><BASE href='http://localhost/t/h.html' />
<link rel="stylesheet" type="text/css" href="/bgh.css">
<style type="text/css">
.b{
    color:green;
}
</style>
<base href="http://foo.example.com/">
</head><body>Sample Text. No Style
<script>Hello malicious code</script>
<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>

<a href="/bgsample.html">Link</a><br><br><div style='color: #666666; font-size: 12px'>Clipped on 6-October-2012, 07:37:39 PM from <a href='http://localhost/t/h.html'>http://localhost/t/h.html</a> </div></body></html>

Преобразува се в:

<html><head>  


<style type="text/css">
.b{

    color:green;
}
</style>



</head><body>Sample Text. No Style

<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>

<a>Link</a><br><br><div style="color: #666666; font-size: 12px">Clipped on 6-October-2012, 07:37:39 PM from <a href="http://localhost/t/h.html">http://localhost/t/h.html</a> </div></body></html>

Тъй като това премахва външните хипервръзки и CSS, то проваля целта на самата добавка. Това, което искам, е само скриптовете да бъдат премахнати:

<html><head><BASE href='http://localhost/t/h.html' /> <BASE href='http://localhost/t/h.html' /> 
<link rel="stylesheet" type="text/css" href="/bgh.css">

<style type="text/css">
.b{

    color:green;
}
</style>
<base href="http://foo.example.com/">


</head><body>Sample Text. No Style
<p class="a">External Style</p>
<p class="b">Internal Style</p>
<p style="color:blue">Inline Style</p>

<a href="/bgsample.html">Link</a><br><br><div style='color: #666666; font-size: 12px'>Clipped on 6-October-2012, 07:37:39 PM from <a href='http://localhost/t/h.html'>http://localhost/t/h.html</a> </div></body></html>

Може ли някой да хвърли малко светлина върху това?


person Jayarathina Madharasan    schedule 06.10.2012    source източник


Отговори (2)


Връзките към външни стилове се премахват поради причина: външните стилове не могат да бъдат валидирани и може да са опасни (по-специално -moz-binding може да се използва за изпълнение на код). Също така, предположението е, че можете да поставите HTML кода на място, където следването на относителни връзки не е безопасно (като имейл съобщения в Thunderbird). Абсолютните връзки обаче винаги са добре.

Това, което може да искате да направите, е да обработите предварително HTML кода, за да премахнете тези проблеми - да разрешите относителни връзки и вградени препратки към външни стилове. Нещо като това:

// Parse the HTML code into a temporary document
var doc = Cc["@mozilla.org/xmlextras/domparser;1"]
               .createInstance(Ci.nsIDOMParser)
               .parseFromString(html, "text/html");

// Make sure all links are absolute
for (var i = 0; i < doc.links.length; i++)
    doc.links[i].setAttribute("href", doc.links[i].href);

// Make sure all stylesheets are inlined
var stylesheets = doc.getElementsByTagName("link");
for (i = 0; i < stylesheets.length; i++)
{
    try
    {
        var request = new XMLHttpRequest();
        request.open("GET", stylesheets[i].href, false);
        request.send(null);
        var style = doc.createElement("style");
        style.setAttribute("type", "text/css");
        style.textContent = request.responseText;
        stylesheets[i].parentNode.replaceChild(style, stylesheets[i]);
        i--;
    }
    catch (e)
    {
        // Ignore download errors
    }
}

// Serialize the document into a string again
html = Cc["@mozilla.org/xmlextras/xmlserializer;1"]
         .createInstance(Ci.nsIDOMSerializer)
         .serializeToString(doc.documentElement);

// Now sanizite the HTML code
var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var sanitizedHTML = parser.sanitize(html, parser.SanitizerAllowStyle);

Обърнете внимание, че използвах синхронен XMLHttpRequest за изтегляне на съдържанието на стиловата таблица - това беше направено за простота, вашият окончателен код трябва да използва асинхронни изтегляния (най-вероятно чрез request модул), които няма да закачат потребителския интерфейс.

person Wladimir Palant    schedule 12.10.2012
comment
Здравейте, получавам грешка в оператора catch, ReferenceError: XMLHttpRequest не е дефиниран. Опитвам се да използвам API за заявки (добавки. mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/), но това е твърде бавно... и през повечето време виси :( - person Jayarathina Madharasan; 16.12.2012
comment
@JayarathinaMadharasan: С SDK за добавки трябва да използвате модула request. Ако имате проблеми с използването му, трябва да създадете нов въпрос - обикновено той не е нито бавен, нито нестабилен. - person Wladimir Palant; 16.12.2012
comment
Благодаря много за вашите насоки. Направих го да работи въз основа на вашия код. Специално този, който прави всички връзки към роднина. - person Jayarathina Madharasan; 29.12.2012
comment
опа съжалявам, не го знаех :(.. Но го направих сега... Благодаря много... :) - person Jayarathina Madharasan; 03.01.2013

И първият параметър в това се казва, че е елемент на документ. Нямам представа какво трябва да е това?

Не ти трябва това. Просто използвайте метода nsIParserUtils.sanitize, който просто получава като вход низ и връща като изход дезинфекцираната версия:

var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var sanitizedHTML = parser.sanitize(html, flags);

Проверете връзката над раздела „Константи“, за да видите кои флагове трябва да имате във вашия сценарий.

person ZER0    schedule 06.10.2012
comment
За информация: преди анализиране се уверете, че всичките ви връзки са абсолютни, в противен случай анализаторът ще ги премахне всички. - person Jayarathina Madharasan; 29.12.2012