Mozilla Firefox + Greasemonkeyでステータスバーに表示されるリンクを開くようにして、「I'm Feeling Lucky検索」を発動させないサンプル

はてなダイアリーの障害で昨日書けなかった内容。っていうか見出し↑長すぎ。
セキュリティホール memoあたりで知った。

I'm Feeling Lucky検索になる厳密な条件がわからないので、とりあえず「%2E%2Fを元に戻してやればいいんじゃない?」ということにしてスクリプトを書くことに。いちおうRFC 3986とかも参照しつつ、結局よくわかんないからhostっぽいところだけを対象にしたつもりになる。
試した環境はこんな感じ。バージョンとかは多少違っててもよいはず。

OS
Microsoft Windows XP Home Edition (SP2)
ブラウザ
Mozilla Firefox 1.5.0.7
その他
Greasemonkey 0.6.5.20060727

で、スクリプトはこうなった。コメントとデバッグ用のコードを消せばブックマークレットにもできるはず。

/*
 * nutsec.user.js (2006-09-30)
 */

// ==UserScript==
// @name        I ain't Feeling Lucky
// @namespace   http://d.hatena.ne.jp/mitamu/
// @description http://www.ne.jp/asahi/nut/security/
// ==/UserScript==

(function() {
  const DEBUG = false;

  var a = document.getElementsByTagName('a');
  var n = a.length;

  for(var i = 0; i < n; i++) {
    var u = a[i].href;

    // scheme://[userinfo@]host[:port][/segment][?query][#fragment]
    if(u.match(/^([A-Z][-A-Z0-9+.]*:\/\/([^@]*@)?)([^:/?#]+)(([:/?#].*)?)$/i)) {
      var s1 = RegExp.$1;       // scheme://[userinfo@]
      var s3 = RegExp.$3;       // host
      var s4 = RegExp.$4;       // [:port][/segment][?query][#fragment]

      if(!s1.match(/^javascript:/)) {
        // ('%2E', '%2F') -> ('.', '/')
        a[i].href = s1 + s3.replace(/%2[EF]/gi, function(s) {
          return String.fromCharCode(parseInt(s.substring(1), 16));
        }) + s4;

        if(DEBUG) {
          GM_log(i + '\nu: ' + u +
                  '\ns1: ' + s1 + '\ns3: ' + s3 + '\ns4: ' + s4 +
                  '\na[i].href: ' + a[i].href);

          if(a[i].href != u) {
            a[i].style.color      = 'white';
            a[i].style.background = 'red';
          }
        }
      }
    }
  }
})();

とりあえずは偽装リンクをクリックしてもhttp://www.ipa.go.jp/security/personal/kujo_manga/に移動するようになったっぽい。
…とかやってたら、Firefoxの設定で対応する方法がid:hasegawayosuke:20060928:p1に書かれてた。すなおに設定変更した方がいいと思う。あと、location.hrefCAPSで設定禁止にすればよろし。