10

Chrome拡張機能を使用してリモートWebページをバックグラウンドページにロードすることは可能ですか?

"background": {
    "page": "local.html"
  }

動作しますが

"background": {
    "page": "http://...."
  }

次のエラーで失敗します:

Could not load background page http://....
4

1 に答える 1

13

いいえ、それは不可能です。Chrome 22以降は可能です-回答の下部を参照してください。

バックグラウンド スクリプトを手動で作成できるように、マニフェスト ファイル内のリソースをホワイトリストに登録でき ます。ネットワークがダウンした場合に備えて、拡張機能にフォールバック リソースが含まれていることを確認してください。https:

<!-- ... doctype etc ... (background.html) -->
<script src="https://..../external_bg.js"></script>
<script src="bg.js"></script>

コンテンツ セキュリティ ポリシー (CSP)により、インライン JavaScript を実行できないため、外部 JS ファイルを使用する必要があります。bg.js次のようになります。

if (!window.namespace_of_external_bg) {
    // Fallback, by defining fallback methods or injecting a new script:
    document.write('<script src="fallback_bg.js"></script>');
}

ページを動的に構築する場合は、eval-like メソッドの使用は避けてください。これも CSP によって禁止されているためです。テンプレートを作成し、外部値をリクエストしてテンプレートに入力できます。localStorage変数をキャッシュするために使用できます。外部リソースのキャッシュの例については、現在のページの html に外部 JavaScript を追加する Chrome 拡張機能を参照してください。この回答はContent scriptsevalを参照しているため、正確な方法を使用してキャッシュ スクリプトを有効にすることはできません (スクリプトを読み込むために を使用する必要があるため)。ただし、キャッシュ技術は引き続き使用できます。


また、次の方法を使用しようとしましたが、機能しませ(この回答に含まれているため、自分で試す必要はありません): AJAX 応答から
aを作成し、一時 URL を作成してロードする資源。BlobwebkitURL.createObjectURL

// Modification of https://stackoverflow.com/a/10371025
// Instead of `chrome.tabs.executeScript`, use 
// x.responseText  or  x.response (eg when using x.responseType='arraybuffer')
var blob = new Blob([x.responseText], {type: 'application/javascript'});
var url = (window.URL || window.webkitURL).createObjectURL(blob);
var s = document.createElement('script');
s.src = url;
document.head.appendChild(s);

前のコードでは、次のエラーが発生します。

スクリプト「blob:chrome-extension%3A//damgmplfpicjkeogamlgiceidmilllf/96356d24-3680-4188-812e-5661d23e81df」の読み込みを拒否しました。これは、次のコンテンツ セキュリティ ポリシー ディレクティブに違反しているためです:「script-src 'self' chrome-extension-resource: "。

バックグラウンド ページでの外部リソースの読み込み

Chrome 22 以降、( unsafe-evalCSP ポリシーを使用して) バックグラウンド ページで https 以外のリソースを読み込むことが技術的に可能になりました。セキュリティ上の懸念から、これは明らかに推奨されません(たとえば、 MITM 攻撃の影響を受けやすいため)。

任意のリソースをロードし、バックグラウンド スクリプトのコンテキストで実行する例を次に示します。

function loadScript(url) {
    var x = new XMLHttpRequest();
    x.onload = function() {
        eval(x.responseText); // <---- !!!
    };
    x.open('GET', url);
    x.send();
}
// Usage:
loadScript('http://badpractic.es/insecure.js');
  • unsafe-evalCSP ポリシーを指定する必要があります。
  • いつものように、クロスオリジン リクエストを作成するには、URL がpermissionsセクションのマニフェストでホワイトリストに登録されているか、サーバーでCORSが有効になっている必要があります。

したがって、マニフェストには少なくとも次のものが含まれている必要があります。

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"permissions": ["http://badpractic.es/insecure.js"],
"background": {"scripts": ["background.js"] }
于 2012-08-07T12:35:32.327 に答える