携帯電話のリファラー(2)

多くの携帯サイトでは、GETパラメータでセッションIDの引き回しをしているようです。そのようなサイトでは、ユーザが外部サイトへのリンクを踏んだ際に、リファラーからセッションIDが外部サイトに漏れてしまう問題が指摘されています。

今日はこの問題について、思いつくことをいくつか書きます。

セッションIDの変更

奇妙に思われるかもしれませんが、単純にセッションIDを毎回変更することは、上記の問題を解決してくれます(ただし、後述するように副作用があります)。

例えば、http://www.example.com/a.cgi?SESSION=11111 にリクエストが来た場合、サーバ側ではセッションIDを変更し(ここでは22222に変更するとします)、以下のレスポンスを返すとします。

■リクエスト
GET http://www.example.com/a.cgi?SESSION=11111 HTTP/1.0

■レスポンス
<html>
<body>
<p><a href="外部サイト">外部へのリンク</a></p>
<p><a href="b.cgi?SESSION=22222">内部へのリンク</a></p>
</body>
</html>

この場合、ユーザが「外部へのリンク」を辿って、リファラーから「11111」というセッションIDが外部に漏れたとしても、問題になることはありません。「11111」というセッションIDは、このページが生成された時点でサーバ側で無効になっているからです。

ただし、この方法には副作用があります。まずリロード(再読込み)ができなくなります。ブラウザ機能の「戻る」「進む」なども同様に影響を受けます。これは、セッションIDを毎回変更することで、URLがワンタイム(使い捨て)になるからです。

この他にも、ボタン・リンクの二度押しや、タイムアウトなどによって、サーバ側とクライアント側のセッションIDにくい違いが生じることがありえます。このような場合、恐らくユーザにログインなどからのやり直しを強いる結果になってしまいます。

調べてみると、この辺のことは、SecurIT-Advisory 2000-001 Cookieを使用せずURLに埋め込むIDに頼ったセッション管理方式の脆弱性(1) − REFERER情報取得による脆弱フリーメールサイトの乗っ取り問題 − のIII-4に少し書かれていました。なんと2000年の資料です。

なお、二度押しやタイムアウトによるくい違いは、CookieでセッションID管理をしている場合にも発生しえます。セッションハイジャック対策として、毎回セッションIDを変更する場合、この種の問題に注意が必要かもしれません。

リダイレクタを使う対策

次にオーソドックスに、リダイレクタを使ってリファラーを振い落とす方式について書きます。この方式は、おさかなラボ - 携帯電話からセッションIDの漏洩を防ぐなどに書かれています。

今日の日記で書きたいのは、リダイレクトを行なっても、リファラーを振い落とすことはできない場合があるので要注意だよ、という話です。

PCブラウザ(IE6)とAU携帯(A5406CA)で、実際に試してみました。

以下の4通りの方法でリダイレクトさせて、リファラーを見ました。

1. HTTPヘッダのLocation
2. HTTPヘッダのRefresh
3. METAタグのRefresh
4. JavaScript(locationのhrefメソッド)

1ではIE6・AU携帯とも、リダイレクト先に送られたリファラーは、リダイレクタのURLではなく、リダイレクタの前のページのURL(セッションID付きのURL)でした。残念ながら、この方法ではリファラーを落とせないということです。

2,3,4については、IE6ではリファラーヘッダ無しでリダイレクト先に移動しました。AU携帯では、そもそもリダイレクトに失敗する結果となりました*1

リファラ実験 - referrer test(Kosekiさん)には、色んなPCブラウザでのリファラ実験結果が載っています。これを見ると1については、多くのブラウザで共通の動作のようです(HTTPの規格をあたっても、根拠は見出せませんが)。

それじゃあどうすべきなのか、という話になるわけですが、残念ながら私にはそれを語るほどの携帯の知識はありません(HDMLなんてやったことが無いくらいです…)。

ただ、2chのような方法ならば、元ページのURLが外部に漏れることはないだろうと思います。要は、自動で遷移するリダイレクタを諦めて、中間ページ(ime.nu)を挟んで外部サイトにリンクする方法です。外部サイトに移動することがユーザに伝わるので、ある意味ではメリットのある方法かもしれません。

*1:AU携帯での実験結果は当然といえるかもしれません。JavaScriptは使えませんし、RefreshはRFCに規定が無いものですから。