[解決済み】コンテンツセキュリティポリシー(CSP)とはどのようなものですか?
質問
デベロッパーコンソールでエラーが多発するのですが。
文字列の評価を拒否されました
インラインスクリプトの実行は、以下のコンテンツセキュリティポリシーディレクティブに違反するため、拒否されました。
スクリプトの読み込みを拒否されました
スタイルシートの読み込みを拒否された
これはどういうこと?コンテンツセキュリティポリシー(CSP)はどのように機能するのですか?どのように
Content-Security-Policy
HTTPヘッダーは?
具体的には、どのように...
- ...複数のソースを許可しますか?
- ...異なるディレクティブを使用しますか?
- ...複数のディレクティブを使用しますか?
- ...ポートを扱うか?
- ...異なるプロトコルを扱うことができますか?
-
...できるようにする
file://
プロトコル? -
...インラインスタイル、スクリプト、タグを使用する
<style>
と<script>
? -
...できる
eval()
?
そして最後に。
-
は具体的にどのようなものなのでしょうか?
'self'
の意味は?
どのように解決するのですか?
その
Content-Security-Policy
メタタグを使用することにより
XSS
ブラウザがそれ以外の場所からデータを読み込むのを防ぐために、リソースの読み込み元を定義することができるようになり、攻撃を防ぐことができます。これにより、攻撃者が悪意のあるコードをサイトに注入することが難しくなります。
なぜCSPエラーが次々と発生するのか、その原因を突き止めようと頭を抱えたが、その仕組みについて簡潔で明快な説明はないようだ。そこで、私が試みたのは以下のような説明です。 一部 CSPのポイントを簡単に説明し、主に私が難しいと感じた点を中心に説明します。
簡潔さのために、各サンプルにタグの全文を書くことはしません。その代わり
content
プロパティを使用するため、サンプルでは
content="default-src 'self'"
は、このような意味です。
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
1. 複数のソースを許可するにはどうすればよいですか?
ディレクティブの後に、スペースで区切ったソースを列挙するだけでよいのです。
content="default-src 'self' https://example.com/js/"
以外のパラメータは引用符で囲まないことに注意してください。
特別
のようなものです。
'self'
. また、コロン(
:
の後にある ディレクティブ、そしてスペースで区切られたパラメータのリストだけです。
指定されたパラメータ以下はすべて暗黙のうちに許可されます。つまり、上記の例では、これらは有効なソースとなります。
https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js
しかし、これらは有効ではありません。
http://example.com/js/file.js
^^^^ wrong protocol
https://example.com/file.js
^^ above the specified path
2. ディレクティブはどのように使い分ければよいのですか?それぞれ何をするのですか?
最も一般的なディレクティブは。
-
default-src
javascript、画像、CSS、フォント、AJAXリクエストなどを読み込むためのデフォルトのポリシーです。 -
script-src
javascript ファイルの有効なソースを定義します。 -
style-src
は、CSS ファイルの有効なソースを定義します。 -
img-src
は画像の有効なソースを定義します。 -
connect-src
は、XMLHttpRequest (AJAX)、WebSocket、または EventSource に対する有効なターゲットを定義しています。ここで許可されていないホストへの接続が試みられた場合、ブラウザは400
エラー
他にもありますが、最も必要とされるのはこれらのものです。
3. 複数のディレクティブを使用するにはどうすればよいですか?
すべてのディレクティブは、1つのメタタグの中で、セミコロンで終端して定義します (
;
):
content="default-src 'self' https://example.com/js/; style-src 'self'"
4. ポートの扱いはどうすればいいですか?
デフォルトのポート以外は、許可されたドメインの後にポート番号またはアスタリスクを追加して、明示的に許可する必要があります。
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"
上記のような結果になります。
https://ajax.googleapis.com:123
^^^^ Not ok, wrong port
https://ajax.googleapis.com - OK
http://example.com/free/stuff/file.js
^^ Not ok, only the port 123 is allowed
http://example.com:123/free/stuff/file.js - OK
先ほど述べたように、アスタリスクを使用して、すべてのポートを明示的に許可することもできます。
content="default-src example.com:*"
5. 異なるプロトコルを扱うにはどうしたらよいですか?
デフォルトでは、標準的なプロトコルのみが許可されます。例えば、WebSocket を許可するには
ws://
は、明示的に許可する必要があります。
content="default-src 'self'; connect-src ws:; style-src 'self'"
^^^ web Sockets are now allowed on all domains and ports.
6. ファイルプロトコルを許可するには
file://
?
そのように定義しようとすると、うまくいきません。その代わり
filesystem
パラメータを使用します。
content="default-src filesystem"
7. インラインスクリプトやスタイル定義を使用するにはどうしたらよいですか?
明示的に許可されていない限り、インラインのスタイル定義や、以下のようなコードを使用することはできません。
<script>
のようなタグプロパティ、または
onclick
. このように許可するのです。
content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"
また、インラインでbase64エンコードされた画像を明示的に許可する必要があります。
content="img-src data:"
8. を許可するにはどうすればよいですか?
eval()
?
多くの人は、「evalは悪であり、世界の終わりをもたらす最も可能性の高い原因である」と言うだろう。しかし、それは間違いです。確かにevalを使うとサイトのセキュリティに大きな穴を開けることができますが、完全に有効な使用例もあります。ただ、賢く使うことが必要なのです。このように許可しています。
content="script-src 'unsafe-eval'"
9. 具体的にどのような
'self'
の意味は?
を取るかもしれません。
'self'
は、localhost、ローカルファイルシステム、または同じホスト上のものという意味です。そのような意味ではありません。コンテンツ・ポリシーが定義されているファイルと同じスキーム(プロトコル)、同じホスト、同じポートを持つソースを意味します。あなたのサイトはHTTPで提供されていますか?明示的に定義しない限り、httpsは使えません。
私はこれまで
'self'
を含めることは通常意味があるため、ほとんどの例でこれを使用していますが、決して必須ではありません。必要なければ削除してください。
でも、ちょっと待ってください!
を使うことはできないのでしょうか?
content="default-src *"
で終わりですか?
いいえ。セキュリティ上の脆弱性があることは明らかですが、期待通りに動作しません。たとえ いくつかのドキュメント は何でも許されると主張していますが、それは真実ではありません。インラインやエバルを許さないので、あなたのサイトを本当に、本当に脆弱にするには、これを使うことになるでしょう。
content="default-src * 'unsafe-inline' 'unsafe-eval'"
... でも、あなたはそうしないと信じています。
さらに読む
関連
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み] 次の Content Security Policy ディレクティブに違反するため、スクリプトの読み込みを拒否しました。
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] Chrome 28でコンテンツセキュリティポリシーの "データ "がbase64画像に対して機能しない件
-
[解決済み] コンテンツセキュリティポリシー。ページの設定によりリソースの読み込みをブロックした
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】 \u003C とは何ですか?
-
[解決済み] addEventListenerとonclickの比較
-
[解決済み] フォント 'data:font/woff......' の読み込みを拒否されました。これは、次のコンテンツセキュリティポリシー指令に違反しています: "default-src 'self'"。font-src' に注意してください。