WPSU を作っていて気になったことがある。
WPSU を使って Googleを開くとログインしたはずが無いのに、ログイン状態で表示される。
(右上にメールアドレスが記載)
普段 Safari でこのアカウントを使っているのだが、
もしやクッキーは WebKitを使ったアプリケーションで共有されている?
Safariを開きログイン状態であることを確認した後、試しに WPSUでログアウトしてみると Safariの方でもログアウト状態になっていた。おおなんてこった。これってまずくないのか?
WebKitにはクッキーを扱うクラスは見つからなかった。Foundation.framework を調べると NSHTTPCookieStorage というクラスが見つかった。キャッシュの時と同様 Foundation.framework で管理されているようだ。
ADC - NSHTTPCookieStorage Class Reference
Overview には、はっきりと "a singleton object (shared instance)" と書かれている。
サンプルを作って動作を見てみる。
サンプル:CookieStudy.zip
-[NSHTTPCookieStorage cookies]の結果をデバッガコンソールへ吐き出してみよう。
コードはこんな感じ。
@implementation AppController
- (void)awakeFromNib
{
NSHTTPCookieStorage* cookie_storage =
[NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray* cookies = [cookie_storage cookies];
NSLog(@"%@", cookies);
}
@end
実行するとでるわでるわ、すべてのクッキーが表示された。
表示内容はこんな感じ。
<NSHTTPCookie version:0 name:@"__utmz" value:@"1981754.1243.1.1.utmcsr=google.co.jp/"
expiresDate:@"2010-01-13 00:40:03 +0900"
created:@"2692303.4789"
sessionOnly:FALSE
domain:@".deep.csi.com"
path:@"/"
secure:FALSE
comment:@"(null)"
commentURL:@"(null)"
portList:(null)>
※一部値を改変
- - - -
悪意のある WebKitアプリケーションがクッキー情報を好きにできるってことか。
と思ったりもしたが、
この件に限らず悪意のあるプログラムを走らせたら何でもできるという点で特別問題視する事でもないか。
ただ異なるブラウザ間でログイン状態が共有されるのはあまり気持ちのよい状況ではないな。