ad4U と cookie と バグ

ad4U の隠しリンクを表示させるグリモン書いてから、サルのようにinfoseekニュースにアクセスしまくって気づいたんだけど、どうも cookie を許可しないと ad4U が動いていないっぽい。
そこで、http://news.www.infoseek.co.jp/ にアクセスするといろいろとダウンロードされるファイルのうち http://grp01.ias.rakuten.co.jp/content/ad/DCBT/delivery/ad/103.html?ほげ から呼び出される http://grp01.ias.rakuten.co.jp/content/ad/DCBT/delivery/script/103.js?ふが が怪しいんじゃないかなー、と思って読んでみた。わかったのは、ブラウザで cookie が使えなければ ad4U を無効にしてるんじゃないかな?ということだ。あくまで自主的にですが。

たぶんココがカギです

http://grp01.ias.rakuten.co.jp/content/ad/DCBT/delivery/script/103.js から一部抜粋。

// http://grp01.ias.rakuten.co.jp/content/ad/DCBT/delivery/script/103.js

/* AdFit's ad delivery script. */
(function(){
  function Cookie(){
    (略)
    this.check = function(){
      if(navigator.cookieEnabled != undefined){
        return navigator.cookieEnabled;
      }
      do{
        var name = "test"+Math.random();
      }while(document.cookie.indexOf(name) != -1);
      document.cookie = name+"=test;path=/;"
      if(this.get(name)){
        this.clear(name);
        return true;
      }
      else return false;
    }
    this.checkOptout = function(name){
      if (document.cookie.length>0) {
        offset = document.cookie.indexOf(name);
        if (offset != -1){
          return true;
        }
      }
      return false;
    }
  }

  var cookies = new Cookie;
  if(!cookies.check() || cookies.checkOptout("BTA002")){
    var imp_beacon_path = "http://log.ad4u.drecom.jp/img/ad_id_103/gen_24/ad4usess_/opt_1/access.gif?timestamp=" + (new Date()).getTime();
    var click_beacon_path = "http://log.ad4u.drecom.jp/img/bt_id_/ad_id_103/ad4usess_/gen_24/click.gif?timestamp=" + (new Date()).getTime();
    document.write("\n      <iframe width=\"300\" height=\"275\" frameborder=\"0\"\n       src=\"http:\/\/grp01.ias.rakuten.co.jp\/content\/ad\/DCBT\/banners\/iframe\/646.html?1228892081\" scrolling=\"no\" id=\"ad4u_frame\"\n      ><\/iframe>\n    ");

    (new Image()).src = imp_beacon_path

  }else{
    (略)
  }

})();
/* vim: set ft=javascript.eruby : */

これはlivedoorでは http://image.adv.livedoor.com/ad4u/delivery/script/107.js?ぴよ にあたるファイルだと思う。そっちも同様の処理だったので略。
注目したいのは、"BTA002"、つまり ad4U を拒否したときに発行された cookie が存在するときと、navigator.cookieEnabled が false の時の処理が同じであることだ。つまり、ブラウザで cookie が使えないなら、 cookie を受け入れた上で ad4U を拒否したのと同じことになる。cookie を拒否するのには有効期限がないから、いちいち拒否するのが面倒、という人は cookie を拒否する設定にしておくのもいいんじゃないかな。いつまで自主的に cookie 拒否 = ad4U 無効、としてくれるかわからんのでオススメはしませんが。

注意です

ただ、 cookie 拒否さえすればいい、というわけじゃないみたいなので注意。サイトごとに cookie の受入をコントロールできるブラウザがありますが、例外サイトとして cookie 拒否をしてもダメです(少なくとも Firefox と IE6 はダメ)。cookie を全て拒否しなくてはなりません。というのも、肝心な navigator.cookieEnabled の値の出力にバグがあるようなのです。
navigator.cookieEnabled ってなんじゃらほい、というレベルの私ですから、 https://developer.mozilla.org/ja/DOM/window.navigator.cookieEnabled を見てお勉強しながらこのエントリを書きました。そこにこんな記述がありました。

bug 230350 のために、cookieEnabled は、Gecko ベースのアプリケーションで誤った結果を返す可能性があります。

bug 230350とやらを読んでみるに、Gecko ベースのアプリではデフォルトの cookie 受け入れの値しか返さないよ、ということらしい。rv:1.9.0.4 Gecko/2008102920 Firefox/3.0.4 な自分のブラウザで確認しましたが、例外サイトに指定したドメインであろうとなかろうと、 navigator.cookieEnabled の値は変わりませんでした。
ちゃんと読んでませんが、 IE もダメっぽいです(フィードバック: navigator.cookieEnabled is always true)。これは IE8 のベータ版のフィードバックなんですが、 IE6 でも再現するとのことなので、手元の IE6 で確認してみました。「ツール > インターネットオプション > プライバシー」で「高」〜「低」とすれば、同ウィンドウの「サイト」ボタンからドメインごとに cookie 受入の可否を設定することが出来るのですが、cookie ブロックを指定したサイトでも navigator.cookieEnabled が true となることを確認しました。 IE7 は手元にないのでわかりませんが、 IE8 でダメなんだからおそらく同じでしょう。
普段 FirefoxIEcookie を許可していて、例外サイトとして rakuten.co.jp や livedoor.com だけを拒否、としても期待はずれにも ad4U は動いちゃいます。ですから ad4U がイヤな人は面倒がらずに毎年 or 毎月拒否しましょう(参考エントリ 1, 2)。
Firefox にしろ IE にしろ、バグ扱いにしているので仕様ではないはず。safari とか google Chrome はサイトごとに設定できなかった気がするので、このバグとは無縁なはず。他のブラウザはわかりません。

よろしくない情報

さて、この現象を逆に考えれば、 cookie を原則として拒否する設定にすれば、常に navigator.cookieEnabled = false ということになります。ブラウザのバグに頼るという極めておすすめできない行為になりますが、「 livedoor Reader 使いたいけど、ad4U を毎月拒否するのめんどくせぇ」という Firefox 使いの方は、 「ツール > オプション > プライバシー > Cookie > サイトから送られてきた Cookie を保存する」のチェックを外し、 livedoor.com を例外サイトとして許可すればよいのです*1livedoor.com の cookie は許可していますので、 livedoor のアカウントには問題なくログインできます。 しかし navigator.cookieEnabled は false のままです。ですから、livedoor Reader を使えて、かつ、毎月拒否申請することなく ad4U は無効状態、ということになります。
まぁ毎月拒否するのがいいと思いますけど、拒否の更新を忘れたときの保険としてはよいかもしれません。

そうそう、ad4U 拒否ページについて

ad4U の可否はひとまず、拒否ページはすぐに修正されるべき。navigator.cookieEnabled = false なら、拒否ページでの動作表示を「 ad4U は無効です」とするべきだ。実際無効にしてるんだから問題なかろう。 ad4U を拒否したいがために仕方なく cookie 許可する人だっているんだぞ。

*1:なお、IE6 では無理。 navigator.cookieEnabled = false とするためには、 cookie を全拒否する必要がありますが、このとき例外サイトを設定できないのでダメです。 IE7 は手元にないのでわかりません。