cookieにおけるhttponlyについての備忘録

PHP

WebサイトやWebアプリを作成するに当たってセキュリティ対策ははもっとも大事な要素の一つです。

Webサイトに脆弱性があると不利益があるばかりか、取り返しのつかない事態にもなり得るので、大事になってきます。

あの仮想通貨運営業者のzaifがセッション情報を盗まれたことでBTCを盗まれかけたという情報もあります。

Zaif のセッション情報が盗まれた原因のひとつについて。JavaScript からクッキー値を取得させない方法。 - clock-up-blog
HTTP Headers という 5万人が使っている Chrome 拡張のマルウェア疑惑。セッション盗まれて BTC も盗まれそうになった話。 の続き。今回は Chrome 拡張とは関係ない、サイト設計側の話です。※本記事では Zaif のセキュリティ上の問題について指摘していますが、非難の意図はありません。

今回はcookieにおけるhttponlyについて、備忘録的な感じで残しておきます。

httpクッキーとは

まずは、httponlyを理解する前にHTTPクッキーの説明をします。
HTTPクッキーとは、HTTP経由でのみアクセスできる(Javascript経由ではアクセスできない)クッキーのことです。

chromeのデベロッパーツールを開き、Apprication>cookieで確認して見ましょう。
下の画像の画面の様になります。


赤枠で囲った部分にチェックが入っていれば、HTTPクッキーがtrueになっているということです。

デベロッパーツールのconsoleのタブより、

document.cookie

を実行してみると、

_ga=GA1.2.844452153.1507899146;

の様なクッキー情報にアクセスできますがHTTPクッキーにチェックマークが入っている情報にはアクセスできていないことがわかります。

 

実際に試して見てください。

 

JavaScriptはブラウザ上で実行できるので、HTTPクッキーがfalseであれば悪意ある攻撃者によるクロスサイトスプリプディングによるクッキー盗聴が行われてしまいます。

phpでhttponlyを設定する

httponlyはクッキーにおけるHTTPクッキーを有効にするための設定です。
httpでしか送信されないCookieということではないので気をつけましょう。

また、デフォルトはfalseとなっています。

 

例えば、PHPではsetcookie()関数の属性でtrueを指定すると有効になります。

サンプルコードは以下になります。


setcookie()の第7引数でtrueを指定しています。

実行結果を確認しましょう。

HTTPクッキーがtrueになっていることがわかります。

 

これでクロスサイトスクリプティングなどのJavaScriptの脆弱性を未然にカバーできることになるので、セキュリティを高めたいcookie情報にはhttponlyを付与するように実装したいですね。