3

Firefoxアドオンサイト(Firefoxアドオン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="h.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="sample.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="h.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="sample.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>

誰かがこれに光を当てることができますか?

4

2 に答える 2

3

外部スタイルへのリンクは、次の理由で削除されます。外部スタイルは検証できず、危険である可能性があります(特に、-moz-bindingコードの実行に使用される可能性があります)。また、相対リンクをたどるのが安全でない場所(Thunderbirdのメールメッセージなど)にHTMLコードを配置できることも前提としています。ただし、絶対リンクは常に問題ありません。

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、ユーザーインターフェイスをハングさせない非同期ダウンロード(ほとんどの場合、モジュール経由)を使用する必要があります。

于 2012-10-12T13:39:31.840 に答える
2

そして、その最初のパラメータはドキュメント要素であると言われています。それが何であるかわかりませんか?

あなたはそれを必要としません。nsIParserUtils.sanitizeメソッドを使用するだけです。このメソッドは、入力として文字列を取得し、出力としてサニタイズされたバージョンを返します。

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

「定数」セクションの上のリンクをチェックして、シナリオで必要なフラグを確認してください。

于 2012-10-06T10:11:02.393 に答える