Firefoxにおけるpath
付きCookie読み取りの不審な挙動
path
付きCookieの読み取りに関するブラウザの挙動についてこんな話が。
要するに、あるディレクトリで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 にアクセスすると…。
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を使用する際は、実装に注意した方が良いかもしれません。