CSP Pinningという仕様がW3Cで検討されている。
https://w3c.github.io/webappsec/specs/csp-pinning/
CSPの設定をユーザエージェントに記憶させ、毎回CSPヘッダを送信しなくても良くする仕様である。
CSP
そもそもCSPとは、JavsScriptや各リソースの読み込み先を制限したり(同一ドメインのみ)、JavaScriptでのevalの実行を制限したり、Websocketの接続先を制限したりする仕組みである。これにより、XSSや各種攻撃を緩和することが出来る。
このCSPはHTTPレスポンスヘッダで以下のように指定する。
Content-Security-Policy: default-src 'self' trustedscripts.foo.com
このようにすれば、自身のオリジンとしていたURLからのみリソースを読み込むことが出来る。
詳しくは仕様やドキュメントを読んでいただけると良いかと思います。
http://www.w3.org/TR/CSP2/
https://developer.mozilla.org/ja/docs/Security/CSP/CSP_policy_directives
CSP Pinning
Content-Security-Policy-Pin
CSPは各ページでContent-Security-Policyヘッダを出す必要があります。Webアプリケーションのエラーページや複雑なアプリケーションでは、各ページで適切なContent-Security-Policyヘッダを出すのが難しい場合もあるかとおもいます。そういった場合にCSP Pinningが使用できるのかと思います。
Content-Security-Policy-Pinヘッダをレスポンスヘッダで指定することで、CSP-Pinningが指定できます。https://example.com/application1/にアクセスした際の、HTTPレスポンスヘッダとして以下の様なヘッダが帰ってきたとします。
Content-Security-Policy-Pin: max-age: 10886400; includeSubDomains; default-src https:; form-action 'none'; frame-ancestors 'none'; referrer no-referrer; report-uri /csp-endpoint/pinned Content-Security-Policy: script-src https://application1.cdn.com; style-src https://application1.cdn.com; connect-src 'self'; form-action 'self'
Content-Security-Policy-Pinで指定できるのは、max-ageとincludeSubDomainsとCSPで定義されているディレクティブになります。
- max-ageは、このPolicyを適応する時間が秒で指定されます。
- includeSubDomainsは、これが指定されている場合はサブドメインでもこのポリシーが適応されます。
上記の例では、https://example.com/application1/にアクセスした際のレスポンスヘッダでしたが、includeSubDomainsが指定されていますので、https://forgotten-partnership.example.com/にアクセスした際にもContent-Security-Policy-Pinヘッダで指定したポリシーが適応されます。
また、Content-Security-Policy-PinヘッダとContent-Security-Policyヘッダが同時に存在している場合はContent-Security-Policyヘッダで指定されてないディレクティブのみContent-Security-Policy-Pinヘッダで指定されたディレクティブが適応されます。
このContent-Security-Policy-Pinヘッダはhttpsで使用される必要があります。
Content-Security-Policy-Report-Only-Pin
ポリシーを強制はしないが、違反があった場合のみ指定したURIにレポートを送信するように指示するContent-Security-Policy-Report-Onlyヘッダがある。これも同様にContent-Security-Policy-Report-Only-Pinヘッダでpinningすることが出来る。