Firefox(52.0.2、Windows)で動作するようにチェックサムでホワイトリストを取得できません。 Firefoxはcaniuseによるとコンテンツセキュリティポリシーバージョン2をサポートしているため、チェックサムをサポートする必要があります。
chromeがインラインスクリプトをブロックすると、必要なsha-256がコンソールに出力されます。これをcspルールに追加すると、スクリプトが正常にホワイトリストに登録されます。チェックサムも httpsで計算されたものと同じです。 ://report-uri.io/home/hash
しかし、Firefoxはそれを受け入れることを拒否します。
MDNドキュメントの例では、チェックサムにbase-64エンコーディングではなくbase-16を使用していることに注意しました。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
しかし、MDNの例でも、同じ結果が得られます。 (また、chromeは基数16のエンコーディングで拒否します)。私は以下のバリエーションをたくさん試しました:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy"
content="script-src 'sha256-076c8f1ca6979ef156b510a121b69b6265011597557ca2971db5ad5a2743545f'">
<title>Hello CSP</title>
</head>
<body>
<script type="text/javascript">var inline = 1;</script>
</body>
</html>
コンテンツセキュリティポリシー:ページの設定により、リソースの読み込みが自動的にブロックされました(「script-src」sha256-076c8f1ca6979ef156b510a121b69b6265011597557ca2971db5ad5a2743545f '」)。出典:var inline = 1;。
次のようにハッシュ値を変更すると機能します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy"
content="script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='">
<title>Hello CSP</title>
</head>
<body>
<script type="text/javascript">var inline = 1;</script>
</body>
</html>
なぜChrome説明します。Chromeで質問の例をテストすると、スクリプトがブロックされ、ハッシュ値sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=
を使用するように指示するエラーメッセージが表示されます。
また、 https://report-uri.io/home/hashvar inline = 1;
を指定すると、同じ値が出力されます。
明らかに奇妙で紛らわしいことが起こっていたので、これを完全に休ませることはできませんでした。そして、私は何か面白いものを発見しました:
+
を-
に置き換え、各/
を_
に置き換えます。出来上がり! Chromeで動作するが、Firefoxでは動作しないチェックサムがあります。 Base64バリアント から判断すると、この形式は不合理ではありません。
Dartium browser は、Chrome 45に基づいて、「代替形式」でチェックサムを出力することがわかりました。これは、クリップボードに入力された方法と思われます。
これはChromeでのみ機能します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-LqkgOOr2rKDFd7Yl4hZ4H8nB0Stbc-RDo573pA7E/XU='">
<title>Hello CSP</title>
<script type="text/javascript">alert("running");</script>
</head>
</html>