Firefoxにおけるpath付きCookie読み取りの不審な挙動

path付きCookieの読み取りに関するブラウザの挙動についてこんな話が。

path=/hoge/

でクッキーを作った場合

Firefoxだと

http://localhost/hoge

でクッキーにアクセスできるけど

IEだと、アクセスできない。

cookie path のブラウザーによる挙動の違い(d.hatena.ne.jp)

要するに、あるディレクトリでpath指定したCookieが、ディレクトリでない(末尾の / がない)URLのコンテンツから読み取れてしまうということですね。

気になったので試してみました。作成したHTML(とJavaScript)はこんな感じ。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>Cookieを読み取り表示する</title>
<script type="text/javascript">
window.onload = function() {
  document.cookie = "nothing-path=1;"; // path指定なしのCookieをセット
  document.cookie = "with-path=1; path=/hoge/;"; // path指定ありのCookieをセット
  var cookie = document.cookie; // Cookieを取得

  var pElement = document.createElement("p");
  if (cookie === null || cookie === "") {
    pElement.appendChild(document.createTextNode("Cookieを読み取れませんでした。"));
  } else {
    pElement.appendChild(document.createTextNode("Cookieの内容は " + cookie + " です。"));
  }
  document.getElementsByTagName("body").item(0).appendChild(pElement);
};
</script>
</head>
<body>
<noscript><p>JavaScriptが有効な環境では、Cookieを表示しようとします。</p></noscript>
</body>
</html>

このHTMLを適当な名前(たとえば cookie.html )で保存します。

そして、拡張子無しのURLでアクセスできるように設定します。いくつか方法はありますが、ApacheではURLを正規表現で書き直すことができるので、それを使ってみます。具体的には、.htaccessに以下の記述を行います。

RewriteEngine on
RewriteRule ^hoge$ cookie.html [L]

ちなみに、mod_rewriteモジュール(httpd.apache.org)が有効になっていないと500エラーになってしまいます。デフォルトでは無効だったと思うので、httpd.confでLoadModuleしている箇所のコメントを外さなければなりません。

そして各ブラウザで http://localhost/hoge にアクセスすると…。

オリジナル画像
図1Internet Explorer 8 で表示した例
オリジナル画像
図2Firefox 3.6 で表示した例

IE 8、Opera 10.6、Google Chrome 8.0、Safari 5では、path指定なしのCookie(nothing-path)しか読み取れません。一方、Firefox 3.6ではpath指定されたCookie(with-path)も読めてしまいました。

実際にはあまりやらないかもしれませんが、次のような設定を行うことで、URL末尾のスラッシュありなしで別々のリソースにすることも可能です。

RewriteEngine on
RewriteRule ^hoge$ foo1.html [L]
RewriteRule ^hoge/$ foo2.html [L]

このような場合にCookieを使用する際は、実装に注意した方が良いかもしれません。