41

Chrome 18 Dev/Canary がリリースされたばかりcontent_security_policyで、特定の拡張機能のマニフェストで必要になります。

CSP をインライン スクリプトで動作させようとしていますが、何か間違っているのか、それとも Chrome 18 のバグなのかわかりません。

マニフェスト.json:

{
    "name": "CSP Test",
    "version": "1.0",
    "manifest_version": 2,
    "options_page": "test.html",
    "content_security_policy": "default-src 'unsafe-inline'"
}

test.html:

<html><head>
<script type="text/javascript">
        alert("hello");
</script>
</head></html>

Chrome 18 では、このアンパックされた拡張機能の読み込みに失敗し、次のエラーが表示されます。

「[拡張機能ディレクトリ]」から拡張機能を読み込めませんでした。 「content_security_policy」の値が無効です。

に変更'unsafe-inline'する'self'と、拡張機能は正常に読み込まれますがalert()機能せず、オプション ページのコンソールに次のエラーが表示されます。

Content-Security-Policy により、インライン スクリプトの実行が拒否されました。

Chrome 16 では、 を'unsafe-inline'使用すると拡張機能が正常に読み込まれ、機能しますalert()。ただし、Chrome 16 では、 に置き換える'unsafe-inline''foo'拡張機能がロードされますが、もちろん動作しませんalert()。したがって、Chrome 18 は 16 よりも厳密である可能性がありますが...

default-src 'unsafe-inline'実際には無効ですか、それともバグですか? alert()Chrome 18 で機能させるには、どの CSP 値を使用できますか?


以下の受け入れられた回答に基づいて、インライン スクリプトは Chrome 18 の拡張機能では機能しなくなりましたalert()。独自の JavaScript ファイルに配置する必要があります。

4

4 に答える 4

37

最近のバージョンの Chrome (46+) では、以前に受け入れられた回答は当てはまりません。unsafe-inlineまだ効果はありません (マニフェストおよびヘッダー タグ内) が、ドキュメントmetaに従って、ここで説明されている手法を使用して制限を緩和できます。

<script>要素のハッシュの使用

このscript-srcディレクティブを使用すると、開発者は特定のインライン スクリプトのハッシュを許可されたスクリプトのソースとして指定することで、そのスクリプトをホワイトリストに登録できます。

使い方は簡単です。サーバーは、特定のスクリプト ブロックのコンテンツのハッシュを計算し、その値の base64 エンコードをContent-Security-Policyヘッダーに含めます。

Content-Security-Policy: default-src 'self';
                     script-src 'self' https://example.com 'sha256-base64 encoded hash'

次の点を考慮してください。

manifest.json :

{
  "manifest_version": 2,
  "name": "csp test",
  "version": "1.0.0",
  "minimum_chrome_version": "46",
  "content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='",
  "background": {
    "page": "background.html"
  }
}

background.html :

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>

結果:
インライン スクリプトからの警告ダイアログ

さらなる調査

metaマニフェストの代わりに、該当するディレクティブをタグに入れることもテストしました。コンソール メッセージに示されている CSP にはタグのコンテンツが含まれていましたが、インライン スクリプトは実行されませんでした (Chrome 53)。

新しいbackground.html :

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='">
  </head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>

結果:
コンテンツ セキュリティ ポリシーに関するコンソール エラー メッセージ

付録: ハッシュの生成

ハッシュを生成する 2 つの方法を次に示します。

  1. Python (JS を stdin に渡し、別の場所にパイプします):
import hashlib
import base64
import sys

def hash(s):
    hash = hashlib.sha256(s.encode()).digest()
    encoded = base64.b64encode(hash)
    return encoded

contents = sys.stdin.read()
print(hash(contents))
  1. JS では、Stanford Javascript Crypto Libraryを使用します。
var sjcl = require('sjcl');
// Generate base64-encoded SHA256 for given string.
function hash(s) {
  var hashed = sjcl.hash.sha256.hash(s);
  return sjcl.codec.base64.fromBits(hashed);
}

インライン スクリプトをハッシュするときは、script タグの内容全体が含まれていることを確認してください (すべての先頭/末尾の空白を含む)。これをビルドに組み込みたい場合は、cheerioなどを使用して関連セクションを取得できます。一般に、任意の に対してhtml、次のことができます。

var $ = cheerio.load(html);
var csp_hashes = $('script')
  .map((i, el) => hash($(el).text())
  .toArray()
  .map(h => `'sha256-${h}'`)
  .join(' ');
var content_security_policy = `script-src 'self' 'unsafe-eval' ${csp_hashes}; object-src 'self'`;

これは、ハッシュを生成するための gulp プラグインであるhash-cspで使用されるメソッドです。

于 2016-07-24T16:58:56.443 に答える
15

次の回答は、古いバージョンの Chrome (<46) に当てはまります。最近のものについては、@Chris-Hunt の回答https://stackoverflow.com/a/38554505/422670を確認してください。

質問https://stackoverflow.com/a/11670319/422670に対して非常によく似た回答を投稿しました

言われているように、v2 拡張機能のインライン セキュリティ ポリシーを緩和する方法はありませんunsafe-inline意図的に、単に機能しません。

すべての JavaScript を js ファイルに移動し、<script src>.

ただし、たとえばマニフェストの次の行を使用して、サンドボックス化された iframe 内で Eval と新しい関数を実行するオプションがあります。

"sandbox": {
    "pages": [
      "page1.html",
      "directory/page2.html"
    ]
},

サンドボックス化されたページは、拡張機能やアプリ API にアクセスしたり、サンドボックス化されていないページに直接アクセスしたりできません (postMessage() を介してそれらと通信する場合があります)。特定の CSP でサンドボックス権限をさらに制限できます

サンドボックス化された iframe と通信することで問題を回避する方法について、iframe の github evalに関する Google Chrome チームの完全な例と、短い分析チュートリアルがあります。

Google のおかげで、ラインナップにはたくさんの拡張機能の書き換えがあります :(

編集

REMOTE スクリプトのセキュリティ ポリシーを緩和することができます。ただし、インライン用ではありません。

に対するポリシーと、 、、およびeval()のようなその関連は、ポリシー に追加することで緩和できます。setTimeout(String)setInterval(String)new Function(String)'unsafe-eval'"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

ただし、これを行わないことを強くお勧めします。これらの関数は、悪名高い XSS 攻撃ベクトルです。

これはトランクのドキュメントに記載されており、スレッド「eval re-allowed」で議論されています

inline scriptsただし、戻ってくることはありません:

インライン JavaScript の実行に対する制限を緩和するメカニズムはありません。特に、次を含むスクリプト ポリシーを設定し'unsafe-inline'ても効果はありません。

于 2012-07-26T14:57:06.933 に答える
3

コンテンツ セキュリティ ポリシー レベル 2 では、インライン スクリプトのハッシュの使用が許可されています。仕様の例から:

Content-Security-Policy: script-src 'sha512-YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo='

代替手段は、再び例からのnonceです。

Content-Security-Policy: script-src 'self' 'nonce-$RANDOM';

それから

<script nonce="$RANDOM">...</script>
<script nonce="$RANDOM" src='save-because-nonce'></script>

これらは Chrome 40 以降でサポートされているように見えますが、現時点で他のブラウザーでどのような運があるかはわかりません。

于 2015-06-22T04:01:03.673 に答える
2

Afaik、これはバグです。

"default-src 'self' https://ssl.google-analytics.com"

働きながら

"default-src 'self' http://ssl.google-analytics.com"

しません。

これは本当に最先端のテクノロジーです。詳細については、 http://code.google.com/p/chromium/issues/detail?id=105796を確認してください。

更新: http://code.google.com/p/chromium/issues/detail?id=107538は、この問題について言及しています。

于 2011-12-14T14:22:47.957 に答える