【问题标题】:XSS to change ASP.NET session stateXSS 更改 ASP.NET 会话状态
【发布时间】:2011-03-04 14:10:51
【问题描述】:

我正在开发将当前用户和用户角色存储到会话状态(System.Web.SessionState.HttpSessionState Page.Session)的应用程序。

        if (Session["username"] == null)
            Session.Add("username", User.Identity.Name);

        if (Session["isAdministrator"] == null)
            Session.Add("isAdministrator", User.IsInRole(domain + "\\Domain Admins"));

在我在代码中检查这些会话状态以授予某些执行权限后:

    if ((bool)Session["isAdministrator"] || computer.Administrators.Contains(Session["username"].ToString()))

接下来我的问题是:这种机制有多安全?是否可以使用一些 JavaScript 或其他方式更改会话状态?

谢谢:)

【问题讨论】:

    标签: c# javascript session-state


    【解决方案1】:

    总的来说,我会说这对 XSS 攻击非常安全。默认情况下,ASP.Net 根据包含用户会话 ID 的 Cookie 跟踪用户会话。如果您打开浏览器 cookie 列表并从您的站点中查找,您可以看到这一点,那里将有一个名为 ASP.Net Session 的东西... SessionID 是唯一的,而不是增量的。可能是 GUID 的一些变化。

    为了增加安全性,您还可以在 web.config 中指定保持用户会话活动的时间。如果您正在处理敏感信息,您可能希望将此超时设置为相对较短的时间段,可能是 10 分钟不活动,默认为 20 分钟。你可以找到更多信息@http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout.aspx

    <system.web>
        <sessionState timeout="10" />
    </system.web>
    

    --彼得

    【讨论】:

      【解决方案2】:

      如果设置了User.Identity.Name,为什么还要放在Session中?为什么不直接调用User.IsInRole(domain + "\\Domain Admins")(或将其包装在助手中)?在我看来您使用的是 Windows 身份验证,因此在会话中设置用户名是多余的。

      至于您的 XSS 问题,会话将会话 ID 存储在 cookie 中,因此理论上攻击者可能会嗅探 HTTP 流量或将 JavaScript 代码注入您的页面,获取 cookie,然后使用它并冒充另一个用户。

      【讨论】:

      • 好的,谢谢。我认为最好直接比较 User.Identity.Name 而不是会话状态值。
      【解决方案3】:

      无法使用 javascript 或其他客户端机制更改会话状态,因为状态仅存储在服务器上。然而,正如其他人所指出的,恶意用户有可能通过获取会话 cookie 的内容来劫持会话。

      ASP.NET 的设计考虑到了这个弱点 - 会话 ID 适当长且难以预测。此外,会话 cookie 被标记为仅 HTTP,这意味着大多数现代浏览器都不允许 javascript 代码访问它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-07
        • 2010-11-02
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        相关资源
        最近更新 更多