【发布时间】:2011-01-31 16:16:21
【问题描述】:
使用这样的代码安全吗?
Response.Cookies[cookieName].Path = Request.ApplicationPath + "/";
我想了解所有极端情况,请...
【问题讨论】:
标签: asp.net html cookies httpcookie
使用这样的代码安全吗?
Response.Cookies[cookieName].Path = Request.ApplicationPath + "/";
我想了解所有极端情况,请...
【问题讨论】:
标签: asp.net html cookies httpcookie
简而言之,不,这不安全。使用 cookie 路径充满了问题,因为它们在 IE 和 Chrome 中区分大小写,但在 FF 中不区分大小写。这意味着路径大小写的任何不匹配都会把事情搞砸。
生成 cookie 时,如果您设置的路径与用户键入的路径不同,浏览器将不会存储它。
当用户返回时,如果他们输入的路径与第一次旅行不同,浏览器不会随请求提供cookie。
你想解决什么问题?
【讨论】:
如果您的应用程序在域的根目录中运行,Request.ApplicationPath == "/"。因此,使用您的代码,您的 cookie 的路径将是 //。你可以通过这样做来避开这个问题:
cookie.Path = Request.ApplicationPath;
if (cookie.Path.Length > 1) cookie.Path += '/';
作为Will correctly points out,您需要确保您的应用程序强制使用一致的 URL 大小写(即,将所有 URL 包含大写字母的请求重定向到对应的小写字母)。
除此之外,我相信你应该没问题。如果您希望所有 cookie 都“应用程序范围”,请考虑使用如下代码创建自定义 IHttpModule(或扩展 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;
}
}
【讨论】:
不,由于 Will 指定的原因,它不安全。
但是...您可能希望使用 this technique 来实现您的意图。
【讨论】: