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, KDECookie の HttpOnly 属性の機能が実装されているようです。
この属性を使用すればユーザの Javascript などによるセッションハイジャック攻撃を回避できる可能性がありますので、クロスサイトスクリプティングなどへの対処を行った上で、この属性を付加するのであれば問題ないように思います。

その他、参考になりそうな情報は以下の通りです。