web-dev-qa-db-ja.com

スクリプトのContent-Security-Policyハッシュ

_<?php
header("Content-Security-Policy: default-src 'sha256-".base64_encode(hash('sha256', 'console.log("Hello world");', true))."'");
?>
<script>console.log("Hello world");</script>
_

しかし、私はまだChromeで受け取ります:

次のコンテンツセキュリティポリシーディレクティブに違反しているため、インラインスクリプトの実行を拒否しました:「default-src 'sha256-1DCfk1NYWuHM8DgTqlkOta97gzK + oBDDv4s7woGaPIY ='」。インライン実行を有効にするには、「unsafe-inline」キーワード、ハッシュ(「sha256 -...」)、またはナンス(「nonce -...」)のいずれかが必要です。また、「script-src」が明示的に設定されていないため、「default-src」がフォールバックとして使用されていることにも注意してください。

私はこれを1時間以上いじっていましたが、例と一致するハッシュをまだ生成できません。

http://software-security.sans.org/downloads/appsec-2014-files/building-a-content-security-policy-csp-eric-johnson.pdf クレーム<script>alert('Allowed to execute');</script>(元の間隔を決定するのは難しい)は_sha256-MmM3YjgyNzI5MDc5NTA0ZTdiCWViZGExZDkxMDhlZWIw NDIwNzU2YWE5N2E4YWRjNWQ0ZmEyMDUyYjVkNjE0NTk=_のハッシュを持っています

これはあまり意味がありません。最後の部分は_sha256-_で始まっていませんが、少なくとも最初のハッシュは正しい長さです。 alert('Allowed to execute');のハッシュとして_sha256-nbFv/38jW7zf8mQirwFemFjDwp5CwIaorxe4Z3yycn0=_を取得します

http://nmatatal.blogspot.com/2013/09/how-my-script-hash-poc-works.html クレーム:<script>console.log("Hello world");</script>には_script-src 'sha256-y/mJvKQC/3H1UwsYAtTR7Q=='_目を見張るもの、それは短すぎるように見えます。


何が悪いのですか?

12
Steven R.

更新:Chromeリリースバージョンではスクリプトハッシュがサポートされていないようです。私のテストはChrome Canaryでのみ機能します(script-srcではないdefault-src

-

「default-src」の代わりに「script-src」を使用してみてください(私の working draft のクイックリーディングに基づく)

4
Joel L

これはまだ非常に混乱しています。私はChrome= 40を実行しています。あなたと同じように、何が起こっているのかを理解するのが好きだったよりもずっと長い時間を費やしました。

CSP 2仕様は、<script>要素のハッシュについてこれを述べています

たとえば、alert('Hello, world.');のSHA-256ダイジェストは_YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=_です。

次のコマンドを実行して、ハッシュを生成できました。

_$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 | base64
YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo=
_

しかし、これはChrome 40.では機能しません機能しません

編集者によるCSPのドラフトにはこれが記載されています

たとえば、alert('Hello, world.');のSHA-256ダイジェストは_qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=_です。

彼らが与える例は次のように生成されます:

_$ echo -n "alert('Hello, world.');" | openssl dgst -sha256 -binary | base64
qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=
_

opensslへの_-binary_フラグの追加は、2つのコマンドの違いです。

これはChrome 40(stable)とChrome Canaryで動作しますが、Firefox 36ではまだ問題があると思います。

9
alexmuller

https://security.stackexchange.com/a/34998/41628

したがって、(Chrome更新まで)しばらくの間、ヘッダー名をX-Contentに戻すだけでよいようです。 -セキュリティポリシー。

0
Steven R.