そのようなコードを使用しても安全ですか?
Response.Cookies[cookieName].Path = Request.ApplicationPath + "/";
すべてのコーナーケースについて知りたいのですが...
そのようなコードを使用しても安全ですか?
Response.Cookies[cookieName].Path = Request.ApplicationPath + "/";
すべてのコーナーケースについて知りたいのですが...
要するに、いいえ、安全ではありません。Cookie パスを使用すると、IE と Chrome では大文字と小文字が区別されますが、FF では区別されないため、問題が発生します。これは、パスの大文字と小文字が一致しないと、問題が発生することを意味します。
Cookie を生成するときに、設定したパスがユーザーが入力したものと大文字と小文字が異なる場合、ブラウザーはそれを保存しません。
ユーザーが戻ってきたときに、入力したパスが最初の旅行と異なる場合、ブラウザーはリクエストで Cookie を提供しません。
どのような問題を解決しようとしていますか?
アプリケーションがドメインのルートで実行されている場合、Request.ApplicationPath == "/"
. したがって、コードでは、Cookie のパスは になります//
。これを行うことで、この問題を回避できます。
cookie.Path = Request.ApplicationPath;
if (cookie.Path.Length > 1) cookie.Path += '/';
Will が正しく指摘しているように、アプリケーションが一貫した URL の大文字と小文字を使用していることを確認する必要があります (つまり、大文字を含む URL を持つすべてのリクエストを対応する小文字にリダイレクトします)。
それ以外は、これで問題ないと思います。すべての Cookie を「アプリケーション スコープ」にしたい場合は、次のIHttpModule
ようなコード (または extends global.asax.cs
) を使用してカスタムを作成することを検討してください。
private void Application_EndRequest(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var cookiePath = app.Request.ApplicationPath;
if (cookiePath.Length > 1) cookiePath += '/';
foreach (string name in app.Response.Cookies.AllKeys)
{
var cookie = app.Response.Cookies[name];
cookie.Path = cookiePath;
}
}
いいえ、ウィルが指定した理由により、安全ではありません。
しかし...この手法を使用して、目的を達成したい場合があります。