2014年12月15日月曜日

Cookieと言う奴

クッキー(Cookie)と言う奴がいる。食べ物ではない。ウェブブラウザの機能の一部だ。
とある理由で、そのCookieを直接編集する必要に迫られた。これは、その時調べたことをまとめたものである。

  1. 記録する方法

    Google ChromeとFirefoxしか確認していないが、この2つのウェブブラウザはMac OS X版、Windows版ともにSQLiteデータベースを使っている。
    Safariはバイナリクッキーで、人間が編集できるようにはなっていない。(SafariではBloggerで自分のページビューを追跡しないようにはできない)
    WindowsのIE (Internet Explorer) も独自フォーマットらしい。

  2. Cookieの場所

    Cookieが保存されている場所はググればすぐ分かる。一例としてMac OS Xの場合を書いておく
    Google Chrome:~/Library/Application Support/Google/Chrome/Default/Cookies
    Firefox:~/Library/Application Support/Firefox/Profiles/xxxxx.default/cookies.sqlite

  3. プライマリーキー

    SQLiteデータベースには必ずプライマリーキーがある。データを区別するためのキーで、Firefoxはidという専用のキーを用意している。
    Google Chromeは(嫌らしく)Cookieの作成日付がそのままプライマリーキーになっている。

  4. 時間のフォーマット

    Firefoxは単純で、100ナノ秒を単位とするUNIX時間である。
    Google ChromeはWin32 File Timeフォーマット(1601/01/01を起点)で、100ナノ秒単位である。
    Win32 File Timeフォーマットは嫌らしい、もといややこしいので、シェルスクリプトを作成したので必要な方は使って欲しい。

  5. 編集

    Adobe AirアプリケーションのLitaが有名だが、Mac OS Xにはsqlite3というコマンドが標準で用意されている。ちなみになぜかは分からないが、Google ChromeのCookieはLitaでは編集できなかった。

    以下にSQLiteデータベースの操作例を示す。

    • 起動とデータベースの表示

      sqlite3 ~/Library/Application\ Support/Google/Chrome/Default/Cookies
      sqlite version 3.7.13 2012-07-17 17:46:21
      Enter ".help" for instructions
      Enter SQL statements terminated with a ";"
      sqlite> .dump
      
    • データの追加

      sqlite> INSERT INTO "cookies" VALUES(13061372681000000,'.xanadu62.blogspot.jp','_ns','','/',13124444681000000,0,0,13061372681000000,1,1,1,X'');
      
    • データの表示と更新 selectが表示コマンド。updateが更新コマンド。

      sqlite> .header on
      sqlite> select * from cookies where host_key='.xanadu62.blogspot.jp';
      creation_utc|host_key|name|value|path|expires_utc|secure|httponly|last_access_utc|has_expires|persistent|priority|encrypted_value
      13061366520000000|.xanadu62.blogspot.jp|_ns||/|13124438520000000|0|0|13061366520000000|1|1|1|v10B????F*A?X????
      sqlite> update cookies set creation_utc=13061367704000000 where host_key='.xanadu62.blogspot.jp';
      sqlite> update cookies set last_access_utc=13061367704000000 where host_key='.xanadu62.blogspot.jp';
      sqlite> update cookies set expires_utc=13124439704000000 where host_key='.xanadu62.blogspot.jp';
      sqlite> select * from cookies where host_key='.xanadu62.blogspot.jp';
      creation_utc|host_key|name|value|path|expires_utc|secure|httponly|last_access_utc|has_expires|persistent|priority|encrypted_value
      13061367704000000|.xanadu62.blogspot.jp|_ns||/|13124439704000000|0|0|13061367704000000|1|1|1|v10B????F*A?X????
    • データの削除

      sqlite> delete from cookies where host_key='.xanadu62.blogspot.jp'
      
    • コマンドの終了

      sqlite> .quit
      

    SQLiteデータベースの操作方法はSQLite入門を参考にした。感謝したい。

以上。