2

このコードをGreasemonkey/Scriptish内で機能させる方法はありますか、それともWebページ自体に挿入する必要がありますか?

body = document.getElementsByTagName("body")[0];
fakeConsole = 'window.top._console';
injected = document.getElementById("sandbox") ? true : false;
sandboxframe = injected ? document.getElementsById("sandbox") : document.createElement('iframe');
sandbox = null;

if (!injected) {
   body.appendChild(sandboxframe);
   sandboxframe.setAttribute('id', 'sandbox');
   sandboxframe.setAttribute('style', "display:none")
}

var p = sandboxframe.contentWindow.eval('1 + 1');
console.log(p);

このコードは、ソースを使用するときに機能します。

 <script type="text/javascript" src="test.js"></script>

しかし、Greasemonkeyスクリプトで使用する場合は、私がよく知らないある種のセキュリティバリアがあることに気づき、unsafeWindowを使用してXPCNativeWrapperをバイパスしようとしました。

これに光を当ててください。

4

1 に答える 1

1

いくつかのこと:

  1. コードにエラーがあります。getElementsById関数ではありません。
  2. それ以外の場合、ディレクティブが適用される場合、そのコードはGreasemonkey1.0以降で機能します。@grant noneこれについては、以下で詳しく説明します。
  3. Scriptishの場合、他のすべてのブラウザー、および@grant none不可能な場合のGreasemonkeyシナリオ。コードを「注入」する必要があります。これについては、以下で詳しく説明します。
  4. Jeremy J Starcherが言うようeval()に、可能な限り避けるべきです。 eval()パフォーマンス、メンテナンス、デバッグ、およびセキュリティがはるかに困難になります。

Greasemonkey 1.0以降の場合:

一部のシナリオでは、Greasemonkeyはを使用しなくなりましたXPCNativeWrapperディレクティブについては、ドキュメントを@grant参照してください。

つまり、これは、(1)スクリプトがGM_関数を使用せず、(2)スクリプトがを指定している場合、コードはそのまま実行されることを意味します(タイプミス@grant noneを除く)。getElementsById

他のスクリプトエンジンはこれを行わないことに注意してください。(正当な理由があります。Greasemonkeyの新しい動作@grant、およびサンドボックスについては、せいぜい物議を醸しています。)

関数を使用する場合GM_は、iframeコードを挿入する必要があります。次のセクションを参照してください。


Scriptish、Privileged Greasemonkey、Chromeなどの場合:

Scriptish、Sandboxed Greasemonkey、Chromeなどはすべて、それぞれのサンドボックス内からiframeを適切に処理しません。(たとえば、これらのQを参照してください。)

GM /ユーザースクリプトからこの種のコードを実行する唯一の信頼できる方法は、それを挿入することです。そのようです:

function gmMain () {
    body = document.getElementsByTagName("body")[0];
    fakeConsole = 'window.top._console';
    injected = document.getElementById("sandbox") ? true : false;
    sandboxframe = injected ? document.getElementById("sandbox") : document.createElement('iframe');
    sandbox = null;

    if (!injected) {
       body.appendChild(sandboxframe);
       sandboxframe.setAttribute('id', 'sandbox');
       sandboxframe.setAttribute('style', "display:none")
    }

    var p = sandboxframe.contentWindow.eval('1 + 1');
    console.log(p);
}

addJS_Node (null, null, gmMain);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}
于 2012-09-27T02:16:11.217 に答える