2010-03-25 78 views

回答

5

总之,不,这不是安全的。使用Cookie路径充满了问题,因为它们在IE和Chrome中区分大小写,但不是FF。这意味着在路径情况下任何不匹配都会造成困难。

  1. 生成cookie时,如果设置的路径与用户输入的内容不同,浏览器将不会存储它。

  2. 当用户返回时,如果他们输入的路径与第一次旅程不同,浏览器将不会向该cookie提供请求。

你想解决什么问题?

+0

我不确定为什么现在需要它。是不是像Jorn解释的那样,使用cookie路径和asp.net模块(或者在asp.net世界之外的替代方案),你可以允许同一个web应用的多个实例在同一个域上运行? – 2010-03-25 11:36:27

+0

如果您的应用程序需要存储状态,并通过ID唯一标识用户会话,则您的应用程序可以共享无路径的单个Cookie。该id用于查找内存或数据库中的值,如果缺少cookie,则发出一个值,或者如果应用程序无法识别该ID,则会分配新条目。此方法工作得很好,但会消耗内存或带有旧值的数据库空间,因此您需要考虑定期清理它们。 – Will 2010-03-25 12:01:24

2

如果您的应用程序域中,Request.ApplicationPath == "/"根运行。因此,使用您的代码,您的Cookie的路径将为//。你可以这样做解决此问题闪避:

cookie.Path = Request.ApplicationPath; 
if (cookie.Path.Length > 1) cookie.Path += '/'; 

由于Will correctly points out,你会希望确保您的应用程序强制URL的一致外壳(即重定向包含大写字母,以他们的等值小写的URL的所有请求) 。

除此之外,我相信你应该没问题。如果你希望所有的饼干是“应用程序为作用域”,可以考虑使用如下代码创建一个自定义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; 
    } 
} 
+0

重定向只有在没有POST的情况下才有可能,因此开发人员必须非常小心小写*所有* url,并且IIS中的虚拟文件夹 - ApplicationPath由它们组成。但正如你所说,大多数问题可以通过将混合病例网址重定向到小写字母来缓解,并使用HttpModule来做到最好。我甚至会失败,因为它会丢失任何想要读取或设置混合大小写的cookie的混合大小写URL。 – Will 2010-03-25 12:04:28

1

不,这是不安全的,因为将指定的原因。

但是...您可能想要聘请this technique来实现您的意图。