27

ユーザーがJavaScriptコード(JavaScriptコンソールなど)を記述して実行できるように、パッケージアプリのChrome拡張機能を作成したいと思います。

eval()この関数を使用してJSコードを実行したいと思います。

従来のjavascripteval関数は、Chrome拡張機能から呼び出されるとエラーをスローします。

キャッチされないエラー:このコンテキストでは文字列からのコード生成は許可されていません

evalChrome拡張機能で使用するには、サンドボックスを使用する必要がありますがマニフェストにサンドボックスを書き込むと、次のエラーが発生します。

この拡張機能をインストールしようとすると、警告が表示されました。「sandbox」は、指定されたパッケージタイプ(テーマ、アプリなど)では許可されていません。

アップデート

この問題によると、サンドボックスはパッケージアプリではサポートされていないため、2つの質問があります。

  1. 代わりに使用できる別の方法はありeval()ますか?

  2. evalサンドボックスなしで使用することは可能ですか?(おそらくセキュリティ上の理由ではないと思いますか?)

4

6 に答える 6

32

アップデート:

少なくとも 2013 年 1 月以降、Chrome はunsafe-evalコンテンツ セキュリティ ポリシー (CSP) ディレクティブを許可するようになりました。これによりeval、サンドボックス外での実行が可能になります。

、、およびeval()に対するポリシーは、ポリシーに追加することで緩和できます。setTimeout(String)setInterval(String)new Function(String)'unsafe-eval'

次のような適切なCSPを拡張マニフェストに追加します。

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

あなたが参照しているバグは現在マークfixedされており、Chrome 22 以降に含まれています。

が導入される前は、拡張機能の CSP で任意のテキストをコードとして実行できるよう 'unsafe-eval'にする方法はありませんでした。当時、Google は、この制限を (サンドボックス化以外で) 削除する方法がないことを明らかにしました。manifest_version: 2

インライン JavaScript や、文字列から JavaScript への危険なメソッド ( などeval) は実行されません。インライン JavaScript の実行に対する制限を緩和するメカニズムはありません。特に、次を含むスクリプト ポリシーを設定しunsafe-inlineても効果はありません。これは意図的なものです。

前述のとおり、この制限は現在緩和されています。

于 2012-08-12T23:03:14.153 に答える
6

新しいパッケージ アプリ (マニフェスト バージョン 2) について話していると思いますよね?

サンドボックスは、新しいパッケージ アプリで使用できます。先週、私はまさにそれを行うサンプルをアップロードしました: ウィンドウはメッセージを非表示のサンドボックス化された iframe に送信し、iframe はハンドルバー テンプレートをコンパイルし (ここでは代わりに eval を使用できます)、コンパイルされた HTML をホスティング ページに返します。結果。

この他のサンプルを確認することもできます。これは、まさにあなたが望むことを行います。

したがって、質問に直接答えるには:

1) いいえ、CSP の制限のためです。Chrome パッケージ アプリで動的な JavaScript を評価する唯一の方法は、サンドボックス化された iframe です。それがアプリのオプションでない場合は、サーバーで JavaScript コンテンツを送信して評価し、結果のみをユーザーに返すこともできます (ただし、これは Chrome パッケージ アプリのオフライン機能を壊します)。

2) いいえ、サンドボックス化された iframe でのみ eval() を使用できます。

于 2012-08-14T19:16:10.847 に答える
1

あなたは試すことができます...

function evalMe(code){
    var script = document.createElement('script');
    script.innerText = code;
    document.querySelector('head').appendChild(script);
}

彼らがそれを無効にしない限り、これは同じ効果を生み出すはずですが、私の知る限り、これは問題ありません. もちろん、スクリプトの場合、たとえばtoerrorsのラッピングを行わない限り、それについて聞くことはありませんstringeval

function myHandler(err){
    // handle errors.   
}

function evalMe(code){
    var script = document.createElement('script');
    var wrapper = '(function(){ try{ @@ }catch(err){ myHandler(err); } })()';
    // Make sure the string has an ending semicolon
    code = code[code.length-1] === ';' ? code : code + ';';

    script.innerText = wrapper.replace('@@', code);
    document.querySelector('head').appendChild(script);
}

または、公式のメカニズムを使用することもできます

http://developer.chrome.com/beta/extensions/tabs.html#method-executeScript

ただし、これにはバックグラウンド ページが必要であり、ページとバックグラウンド ページの間でメッセージ パッシングを使用する必要がありappます。

更新:作業方法

iframeevalと、base64拡張dataURIページと<iframe>. github でコードの作業コピーを取得できます。使用するには、単にレポをクローンまたはダウンロードし、「クライアント」dirをパッケージ化されていない拡張機能として chrome 拡張機能マネージャーにインストールします。プラグインを駆動するコードは次の場所にありますapp.js

iframeEval を使用してテストします。エラー通知は少しバグがありますが、eval動作します。

@appsillers コードを追加せずにプラグインを機能させるには、eval拡張機能windowiframeEvalメソッドをコード内のメソッドで上書きできます。

于 2012-08-14T16:43:38.677 に答える
-1

コードを含むすべての文字列が Chrome パッケージ アプリで拒否されるため、機能しない例を次に示します。

//To run some code from a string without `eval` just do this:
var code = new Function(yourCodeString);
code();
于 2012-08-10T07:24:21.977 に答える