Cookie の HttpOnly 属性
PHP internals で HTTP-Only Patch という投稿がありました。
この Patch を適用するかどうかで議論され、PHP 5.2 系のブランチに適用されたようです(デフォルトでは無効のようです)。
- http://news.php.net/php.internals/25233
- http://news.php.net/php.cvs/39892
- http://ilia.ws/archives/121-httpOnly-cookie-flag-support-in-PHP-5.2.html
これに関連して、気になった記事がありましたので、メモしておきます。
- On HttpOnly, Firefox-specific XSS and this years major Livejournal XSS attack
http://www.rooftopsolutions.nl/article/97
要点だけを拾い読みしてみると以下のようになります。
- HTTP ヘッダの SetCookie フィールドに HttpOnly 属性を追加すると、クライアントサイドスクリプト(Javascript, VBScript など)から document.cookie による呼び出しではデータが読み込めなくなる(例えば、Cookie に保存されているセッション ID を読み出しが困難になる)。
例:Set-Cookie: USER=username; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly
- Firefox では Cookie の HttpOnly 属性は実装されていないが、以下のスクリプトを実行することで代替することが(おそらく)可能。ただし、この方法でも Cookie の内容を参照する方法が存在する。
<script> HTMLDocument.prototype.__defineGetter__("cookie",function (){return null;}); </script>
- 参考:
Wisec - Security Thoughts - HttpOnly and Firefox.
http://www.wisec.it/sectou.php?lang=en
- 参考:
- Cookie の内容を取得する方法にはまだ他にもあるので、あまりこの機能を信頼してはいけない。
Cookie の HttpOnly 属性は、Microsoft が以前に提唱したもので、詳しくは以下のページに書かれています。
- Mitigating Cross-site Scripting With HTTP-only Cookies
http://msdn.microsoft.com/workshop/author/dhtml/httponly_cookies.asp
- 良いニュースと悪いニュース(良いニュース: クロス サイト スクリプティングの問題点を軽減する)
http://www.microsoft.com/japan/msdn/columns/secure/secure10102002.aspx
問題点としては、以下のようなものが挙げられていました。
- HttpOnly 属性による Cookie の読み取り制限に回避方法が存在する。
- Mozilla 系列のブラウザでは実装されていない(無視される)。
- Internet Explorer for Mac では、Cookie を正しく処理できなくなるバグがある。
Internet Explorer 6.0SP1 以降、最近の Opera, Safari, KDE で Cookie の HttpOnly 属性の機能が実装されているようです。
この属性を使用すればユーザの Javascript などによるセッションハイジャック攻撃を回避できる可能性がありますので、クロスサイトスクリプティングなどへの対処を行った上で、この属性を付加するのであれば問題ないように思います。
その他、参考になりそうな情報は以下の通りです。
- PHP 5.1.x 以前の PHP でも、header() 関数を使用すれば Cookie に HttpOnly 属性を付加することが可能です。
header( 'Set-Cookie: PHPSESSID=' . session_id() . '; path=/path/; domain=example.com; HttpOnly' )
PHP マニュアルの setcookie 関数の User Contributed Notes には汎用的な関数も提案されていました。
http://php.net/setcookie#57773
- Cookie に関する RFC(HttpOnly 属性は規定されていません)。
- RFC 2965
http://www.ietf.org/rfc/rfc2965.txt - RFC 2109(Obsolete)
http://www.ietf.org/rfc/rfc2109.txt
- RFC 2965