web-dev-qa-db-ja.com

シングルページアプリケーションに適用されるコンテンツセキュリティポリシー:安全でないインラインを使用する価値はありますか?

VueJSを使用して開発したWebサイト(つまり、単一ページのアプリケーション)があります。コンテンツセキュリティポリシーヘッダーの実装を検討してきました。必要なヘッダー値をテストしたところ、「安全でないインライン」スクリプトを許可する必要があることに気付きました。

私はこれをかなり読み回しましたが、 'unsafe-inline'を適用する必要がある場合、CSPヘッダーは実際にはあまり機能しないことを示すたくさんのコメントを見つけました。

だから私の質問です。 「安全でないインライン」を適用すると、CSPは多かれ少なかれ無意味になりますか? SPAでCSPを処理する方法について何か良いアイデアはありますか?

1
F_SO_K

「安全でないインライン」を適用すると、CSPは多かれ少なかれ無意味になりますか?

XSSの防止は、CSPの主な利点の1つです。インラインスクリプトを許可する必要がある場合、その利点はほとんどなくなります。

しかし、CSPが問題の悪用を防ぐことができる状況がまだいくつかあります。例:

  • クリックジャッキング:CSPはそれを防ぐことができます
  • HTMLインジェクション:XSSを取得できない場合でも、HTMLインジェクションを使用してデータを抽出できます。 CSPは一部の影響を軽減できる場合があります(フォームアクション、画像ソースなどを制限することにより)
  • CSSインジェクション:インラインCSSがない場合は、CSPを介してCSSインジェクションを防ぐことができます
  • 安全でないインラインであっても、CSPはXSSの悪用を困難にする可能性があります。攻撃者はペイロードの長さや特殊文字の制限について心配する必要がないため、XSSを悪用する最も簡単な方法はリモートスクリプトを含めることです。
  • hTTPSを介してコンテンツのロードを強制する

SPAでCSPを処理する方法について何か良いアイデアはありますか?

他のアプリケーションと同じ方法:インラインスクリプトはありません。代わりに、すべてのスクリプトを.jsファイル。これは、信頼できるOriginからインクルードします(これは実際には、インラインJavaScriptを持つ可能性のある従来のアプリケーションと比較して、SPAで実現するのが簡単ようです)あらゆる所に)。

特定のスクリプトブロックを許可する nonceまたはハッシュソースを使用することもできます(正しく実装されているため、XSSは正しく防止されます)。

現時点で安全でないインラインを許可する必要がある場合でも、状況に応じてできるだけ制限の厳しいCSPを実装することをお勧めします。

制限付きのCSPと互換性のある方法で将来の機能を実装するのに役立ちます。また、インラインjsの削除に取り掛かったときは、(新しいCSPの実装に関して複数の問題が発生する代わりに)既に配置されているCSPからunsafe-inlineを削除する必要があります。

1
tim

私はこれをかなり読み回しましたが、 'unsafe-inline'を適用する必要がある場合、CSPヘッダーは実際にはあまり効果がないことを示すたくさんのコメントを見つけました。 「安全でないインライン」を適用すると、CSPは多かれ少なかれ無意味になりますか?

確かに、インラインスタイルとインラインスクリプトを禁止することは、CSPが提供する最大のセキュリティ強化の1つです。ただし、どうしても使用する必要がある場合は、それらを許可するメカニズムがいくつかあります。 nonce-sourceを使用して、特定のインラインスクリプトブロックのみを許可できます。

Content-Security-Policy: script-src 'nonce-2726c7f26c'

要素に同じノンスを設定する必要があります:

<script nonce="2726c7f26c">
  var inline = 1;
</script>

SPAでCSPを処理する方法について何か良いアイデアはありますか?

うまくいけば、これが役立つ(xxをttに変更する):hxxps ://developer.squareup.com/blog/content-security-policy-for-single-page-web-apps/

クレジット: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src

1
Arpit Rohela

はい、とにかくCSPを設定する価値があります。ここにいくつかの利点があります:

  • 実際のXSS脆弱性の多くは、任意の長いペイロードを許可していません。一般的な手法は、別のサーバーから大きなペイロードをロードする小さなペイロードを用意することです。これはCSPで防ぐことができます。
  • frame-ancestorsディレクティブを使用すると、クリックジャッキングを防ぐことができます。
  • object-srcなど、設定する必要のある他の便利なものがあります。 [〜#〜] mdn [〜#〜] には、Niceリストがあります。

しかし、最大の利点はunsafe-inlineをブロックできることです。これは、多くの作業をせずにVue.JSで実現できると思います。

したがって、unsafe-inlineを取り除く方法を見つけることができれば、それは良いことです。しかし、何かがまだ何もないよりはましです。

1
Anders