--- title: 'CSP: style-src' slug: Web/HTTP/Headers/Content-Security-Policy/style-src tags: - CSP - Content - Content-Security-Policy - Directive - HTTP - Reference - Security - Style - source - style-src translation_of: Web/HTTP/Headers/Content-Security-Policy/style-src ---
HTTP の {{HTTPHeader("Content-Security-Policy")}} (CSP) の style-src ディレクティブは、スタイルシートの有効なソースを指定します。
| CSP バージョン | 1 |
|---|---|
| ディレクティブ種別 | {{Glossary("Fetch directive", "フェッチディレクティブ")}} |
| {{CSP("default-src")}} による代替 | あり。このディレクティブがない場合、ユーザーエージェントは default-src ディレクティブを探します。 |
style-src ポリシーには、1つまたは複数のソースが許可されています。
Content-Security-Policy: style-src <source>; Content-Security-Policy: style-src <source> <source>;
{{page("/ja/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src", "Sources")}}
この CSP ヘッダーがある場合、
Content-Security-Policy: style-src https://example.com/
以下のスタイルシートはブロックされ、読み込まれません。
<link href="https://not-example.com/styles/main.css" rel="stylesheet" type="text/css" />
<style>
#inline-style { background: red; }
</style>
<style>
@import url("https://not-example.com/styles/print.css") print;
</style>
{{HTTPHeader("Link")}} ヘッダーで読み込まれるものも同様です。
Link: <https://not-example.com/styles/stylesheet.css>;rel=stylesheet
インラインの style 属性もブロックされます。
<div style="display:none">Foo</div>
JavaScript で直接 style 属性を設定したり、 {{domxref("CSSStyleDeclaration.cssText", "cssText")}} を設定したりしたスタイルも同様です。
document.querySelector('div').setAttribute('style', 'display:none;');
document.querySelector('div').style.cssText = 'display:none;';
しかし、要素の {{domxref("HTMLElement.style", "style")}} プロパティに直接設定されたスタイルプロパティはブロックされず、 JavaScript から安全にスタイルを操作することができます。
document.querySelector('div').style.display = 'none';
この手の操作は、 CSP の {{CSP("script-src")}} ディレクティブで JavaScript を無効にすることで防ぐことができます。
注: インラインスタイルとインラインスクリプトを禁止することは、 CSP が提供する最大のセキュリティ上の利点の一つです。しかし、どうしても使用しなければならない場合は、それらを許可する仕組みがいくつかあります。
インラインスタイルを許可するために、 'unsafe-inline' を指定するか、インラインブロックに一致するノンスソースまたはハッシュソースを指定することができます。
Content-Security-Policy: style-src 'unsafe-inline';
上記のコンテンツセキュリティポリシーは {{HTMLElement("style")}} 要素やあらゆる要素の style 属性などのインラインスタイルを許可します。
<style>
#inline-style { background: red; }
</style>
<div style="display:none">Foo</div>
ノンスソースを使用して、特定のインラインスタイルのみ許可することができます。
Content-Security-Policy: style-src 'nonce-2726c7f26c'
同じノンスを {{HTMLElement("style")}} 要素にも設定する必要があります。
<style nonce="2726c7f26c">
#inline-style { background: red; }
</style>
他にも、インラインスタイルからハッシュを生成することができます。 CSP では sha256, sha384, sha512 に対応しています。
Content-Security-Policy: style-src 'sha256-a330698cbe9dc4ef1fb12e2ee9fc06d5d14300262fa4dc5878103ab7347e158f'
ハッシュを生成するときは、 {{HTMLElement("style")}} タグを含めないようにし、大文字小文字と、ホワイトスペース、特に前後のホワイトスペースに注意してください。
<style>#inline-style { background: red; }</style>
'unsafe-eval' ソース式は、文字列からスタイル宣言を生成するいくつかのスタイルメソッドを制御します。もし 'unsafe-eval' が style-src ディレクティブで指定されていななかった場合、以下のメソッドはブロックされて何の効果も現れません。
| 仕様書 | 状態 | 備考 |
|---|---|---|
| {{specName("CSP 3.0", "#directive-style-src", "style-src")}} | {{Spec2('CSP 3.0')}} | No changes. |
| {{specName("CSP 1.1", "#directive-style-src", "style-src")}} | {{Spec2('CSP 1.1')}} | 初回定義 |
{{Compat("http.headers.csp.Content-Security-Policy.style-src")}}