【问题标题】:Is it safe to use Request.ApplicationPath for cookie path将 Request.ApplicationPath 用于 cookie 路径是否安全
【发布时间】:2011-01-31 16:16:21
【问题描述】:

使用这样的代码安全吗?

Response.Cookies[cookieName].Path = Request.ApplicationPath + "/";

我想了解所有极端情况,请...

【问题讨论】:

    标签: asp.net html cookies httpcookie


    【解决方案1】:

    简而言之,不,这不安全。使用 cookie 路径充满了问题,因为它们在 IE 和 Chrome 中区分大小写,但在 FF 中不区分大小写。这意味着路径大小写的任何不匹配都会把事情搞砸。

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

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

    你想解决什么问题?

    【讨论】:

    • 我不确定为什么现在需要它。是不是像 Jorn 解释的那样,使用 cookie 路径和 asp.net 模块(或在 asp.net 世界之外的替代方案),您可以允许同一个 Web 应用程序的多个实例在同一个域上运行?
    • 如果您的应用需要存储状态,可以共享一个无路径的单一 cookie,通过 id 唯一标识用户会话。 id 用于在内存或 DB 中查找值,如果 cookie 丢失,它会发出一个,或者如果应用程序无法识别 id,它会分配新条目。此方法效果很好,但确实会使用旧值消耗内存或数据库空间,因此您需要考虑定期清理它们。
    【解决方案2】:

    如果您的应用程序在域的根目录中运行,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;
        }
    }
    

    【讨论】:

    • 只有在没有 POST 的情况下才有可能重定向,因此开发人员必须非常小心小写 all url 和 IIS 中的虚拟文件夹 - ApplicationPath 由它们组成.但是正如您所说,大多数问题可以通过将混合大小写的 url 重定向为小写来缓解,并且使用 HttpModule 来做到这一点是最有意义的。我什至会尝试失败,因为它会丢失。
    • 跟进@Will 的评论。在 POSTS 中无法进行重定向,但 PRG pattern 经常使用并消除了此问题。这样做也被认为是最佳实践。
    【解决方案3】:

    不,由于 Will 指定的原因,它不安全。

    但是...您可能希望使用 this technique 来实现您的意图。

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2016-05-07
      • 2011-01-07
      • 2012-08-24
      相关资源
      最近更新 更多