t_komuraの日記

2006-08-12

[][] Cookie の HttpOnly 属性 11:28  Cookie の HttpOnly 属性を含むブックマーク

PHP internals で HTTP-Only Patch という投稿がありました。

この Patch を適用するかどうかで議論され、PHP 5.2 系のブランチに適用されたようです(デフォルトでは無効のようです)。

これに関連して、気になった記事がありましたので、メモしておきます。

要点だけを拾い読みしてみると以下のようになります。

  • 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>
    
  • Cookie の内容を取得する方法にはまだ他にもあるので、あまりこの機能を信頼してはいけない。

Cookie の HttpOnly 属性は、Microsoft が以前に提唱したもので、詳しくは以下のページに書かれています。

問題点としては、以下のようなものが挙げられていました。

  • 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 属性は規定されていません)。

トラックバック - http://d.hatena.ne.jp/t_komura/20060812/1155349717