Contents Security Policy（CSP）のお勉強

# Contents Security Policy（CSP）

個人でのお勉強時のメモです。殆どコピペなので。。。

## CSPとは？

**CSP**（Content Security Policy）は、クロスサイトスクリプティング (XSS) 、データインジェクション、クリックジャッキング、パケットキャプチャなどブラウザに表示されるコンテンツを用いた、よく知られた種類の攻撃を検出して軽減するするために追加されたセキュリティレイヤー。

サーバサイドからブラウザに対してコンテンツの使用ポリシーを伝えて各種攻撃を回避する。

## 仕組み

CSP を記述することで、コンテンツの提供元や取得方法（HTTPS経由のみ取得可能など）を制限することができ、コンテンツ提供者が意図しないコンテンツを読み込ませることを阻止することができる。
コンテンツには実行可能なスクリプトも含まれているため、第三者による悪意のスクリプトの実行を制限することができる。


## ポリシーの記述方法

### デフォルトポリシー

デフォルトでは以下のポリシーが適用される。

* data: URLでのコンテンツの埋込
* \<a href=’javascript:’>のようなhtmlへのjavascriptの埋込
* onclickなどのインラインのイベント属性
* \<script>要素内のインラインスクリプト
* eval() での文字列コード new Function()コンストラクタ
* setInterval()内での文字列コード setTimeout()内での文字列コード
* \<style>要素でのCSSの設定
* インラインのstyle属性

### カスタムポリシー

コンテンツ提供側で変更可能なディレクティブは以下の通り。

* default-src
デフォルトで許可するURIを指定
* inline-script
インラインスクリプトを有効にする
* eval-scriot
evalを有効にする
* script-src
scriptの提供元を指定
* style-src
cssの提供元を指定
* img-src
画像とfavicon の提供元を指定
* font-src
ウェブフォント@font-face で読込まれる提供元を指定
* media-src
audio,video で参照する提供元を指定
* object-src
object,embed,applet で参照する提供元を指定
* frame-src
frame,iframe で参照する提供元を指定
* xhr-src
XMLHttpRequestの提供元を指定
* connect-src
web socketの提供元を指定
* form-action
formの送信先を指定
* sandbox
sandbox属性の値を設定
* plugin-type
pdfなど application/octet-streamヘッダーで提供されるもの



### ディレクティブ

各ディレクティブの詳細は以下を参照。

* [CSP におけるポリシーのディレクティブ](https://developer.mozilla.org/ja/docs/Web/Security/CSP/CSP_policy_directives)
* [Content Security Policy Reference](http://content-security-policy.com/)


### ポリシーのテスト

["report-only" モード](https://www.w3.org/TR/CSP2/#content-security-policy-report-only-header-field)で動作させることで記述したポリシーが適切であることをポリシーをサイトに適用する前に確認することができる。report-only モードで動作している間ポリシーは適用されず、何らかの違反があった場合は指定した URI に報告される。

それ以外にも、Firefox、Google Chrome にはそれぞれテストツールのアドオンが提供されている。

* [CSP Tester](https://www.oxdef.info/csp-tester) - Google Chrome Add-on
* [UserCSP](https://addons.mozilla.org/ja/firefox/addon/newusercspdesign/) - Firefox Add-on


### CSP違反レポート

CSPに違反したリクエストが発生した場合、そのリクエストに関するCSP違反レポート（JSON形式）を生成するように設定できる。違反レポートの送付先を指定することで、違反の蓄積と集計が可能。CSP違反レポートのデータ形式は汎用なので、レポートを受け付けるSaaSも幾つかある。



**違反レポートサービス**

* https://report-uri.io/

※ Google Analytics とかにもありそうなので、探してみたけど見あたらなかった。



## Reference


* [Content Security Policy Level 3](https://w3c.github.io/webappsec-csp/)
* [Content Security Policy Level 3 日本語訳](https://triple-underscore.github.io/CSP3-ja.html)
* [CSP (Content Security Policy) - Web セキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/CSP)
* [Content Security Policy Reference](http://content-security-policy.com/)
* [Preventing XSS with Content Security Policy](http://benvinegar.github.io/csp-talk-2013/#1)
* [CSP（Content Security Policy）について](http://tanakakns.hatenablog.com/entry/2016/02/02/095811) - 2016.2.2
* [Content Security Policy(CSP) 対応と report-uri.io でのレポート収集](https://blog.jxck.io/entries/2016-03-30/content-security-policy.html)
* [ApacheでContent Security Policyを設定したメモ。](http://fdays.blogspot.jp/2015/02/content-security-policy.html)
* [Content Security Policy の導入](https://dev.mozilla.jp/2016/02/implementing-content-security-policy/) 2016.2.18
* [AVTOKYO 2014で「CSPが切り開くWebセキュリティの未来」という題で話してきた](http://d.hatena.ne.jp/hasegawayosuke/20141117/p1)
* [Future of Web Security Opened up by CSP](http://www.slideshare.net/muneakinishimura/future-of-web-security-opened-up-by)
* [CSP(content security policy)をためしてみる](https://blog.kazu69.net/2012/07/11/try-the-csp-content-security-policy/) - 2012.7.11