Cookieといえば、ログインを伴うサイト構築を行う際に、セッションIDを保存するアレだ。
しかし、なんとなく使っているCookieなので、セキュリティとかどうなの?とかHTML5のWeb Storageと比べてどうなの?など、突き詰めるとモヤっとした部分が多い。
今回は、とりあえずCookieの使用を検討するにあたって知っておくべきと思われることをまとめる。
Cookieとは
複数のページを跨いだ、あるいはブラウザの起動を跨いだ情報共有を行うための機構である。 その実態は、PC上に保存されたテキストファイルであり、ページにアクセスする度にサーバーへ送信される。
Cookieのパラメータ
パラメータ | 意味 |
KEY=VALUE | Cookieに設定するキーと値 |
expires=VALUE | 有効期限、省略=ブラウザ終了まで、過去=Cookie削除 |
domain=VALUE | Cookieの送信先ドメイン |
path=VALUE | Cookieの送信先パス |
secure | SSL通信時のみCookieを送信する |
Cookieの発行方法
その1:HTML
<meta http-equiv="Set-Cookie" content="VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;">
その2:JavaScript
document.cookie ="VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;";
その3:サーバーサイド
HTTPヘッダで指定する
Set-Cookie: VISITED=1; expires=Sat,26-Nov-2011 00:00:00 GMT;
Cookieにまつわるセキュリティの話
Domainパラメータ
ockeghem(徳丸浩)の日記によれば、RFC6265に規定されている通り、Cookieの送信先ドメインはDomainパラメータで指定したドメインおよびそのサブドメインであるらしい。
送信先を限定するという意味では、Domainパラメータを指定しない(=発行元ホストのみに限定する)ほうが安全である。
但し、IE9、iモードではDomain指定無しでもRFC6265を無視してサブドメインへも送信してしまうので注意が必要。
Pathパラメータ
PathパラメータではCookieの送信先パスのプレフィクスを指定できるが、その効果は「無用なCookie送信を抑制する」くらいであり、「指定したパス以外にCookieが送信されないことを保証」できるものではない。
高木浩光@自宅の日記に詳細が記されているが、同一ドメイン内の任意のページでFRAME+JavaScriptを利用することでCookieを取得できてしまう。
Cookie Monster Bug(Cross Domain Cookie Injection)
- .example.co.jpに対して発行したCookieは、そのサブドメインであるwww.example.co.jpにも送信される。
- 同様に.co.jpに対して発行したCookieは、あらゆるxxx.xxx.co.jpに対して送信される。
故に.co.jpや.comに対してCookieが発行されないようにブラウザが規制すべきだが、IE9やOpera 11にはこの規制が無い…という問題。
(参考:属性型JPドメインと地域型JPドメインに対するCookie Monster Bug調査)
典型的な影響としてセッションIDの固定化攻撃(Session Fixation)というのがあるらしい。奴らはこんな感じで攻めてくる。
Session Fixation攻撃への対策
- ログインの度にセッションIDを再発行して、ちゃんとCookieに設定し直す。
Cookie Monster Bugへの対策
Cookie Monster Bugの影響により、上位のドメインに対して発行されたCookieが干渉する可能性がある。一例として下記が挙げられる。
SESSIDという名前で2つの値が送信されているHTTPリクエスト
POST /login.cgi HTTP/1.0
(略)
Cookie: SESSID=malicious_cookie; SESSID=08afa677654dcbg44eadfb46e1858119
Content-Type: application/x-www-form-urlencoded
Content-Length: 35
対策として
- 上位のドメインに対して有効期限切れのCookieを発行して無効化する
- 複数SESSIDへの対応を行う(有効なものを探す or エラーとしてしまう)
- Cookie使わない
参考:Cookie Monster襲来! 戦え、星野君
0 件のコメント:
コメントを投稿