【问题标题】:what does forms authentication protect, as opposed to using session variable表单身份验证保护什么,而不是使用会话变量
【发布时间】:2013-05-14 14:32:31
【问题描述】:

我正在开发一个应用程序,它使用 Session 变量来跟踪用户,检查母版页是否存在,否则会导致他们退出登录。我想将其更改为表单身份验证,因为我读到它更安全并且数据已加密。

谁能告诉我哪些数据实际上是加密的?我尝试在我的网站上设置表单身份验证,它工作正常,用户被正确跟踪,并且无法在不登录的情况下访问页面。但是,当我使用 Fiddler 查看请求正文时,我看到了所有表单字段内容。黑客不能使用它来更改数据并重新提交请求,就像他们使用从 Session 变量生成的 cookie 一样?这个应用程序没有使用 SSL,所以我知道 SSL 会加密正文,但我认为这也是 Forms Authentication 会做的事情。否则它会加密什么,只是 cookie 中的 Session ID?

这是我使用的代码:

    <authentication mode="Forms">
  <forms loginUrl="default.aspx" name=".ASPXFORMSAUTH_Test" defaultUrl="home.aspx" protection="All"/>
</authentication>
<authorization>
  <deny users="?"/>
</authorization>

在登录页面我尝试手动创建cookie:

                    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
                    txtEmail.Text,
                    DateTime.Now,
                    DateTime.Now.AddMinutes(30),
                    false,
                    txtEmail.Text,
                    FormsAuthentication.FormsCookiePath);

                // Encrypt the ticket.
                string encTicket = FormsAuthentication.Encrypt(ticket);

                // Create the cookie.
                Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

                // Redirect back to original URL.
                Response.Redirect(FormsAuthentication.GetRedirectUrl(txtEmail.Text, false));

我也试过:

FormsAuthentication.RedirectFromLoginPage(txtEmail.Text, false);

早些时候,得到了相同的结果,Fiddler 中的请求正文显示了所有正在提交的字段及其内容。

【问题讨论】:

  • 不是您问题的答案(我猜 cookie 值包含一些哈希信息,但不确定。)。无论如何,您不应该手动设置 cookie。您应该依赖 FormsAuthentication.SetAuthCookie。这里有一些细节:stackoverflow.com/a/15199149/1236044

标签: asp.net


【解决方案1】:

将您的方法切换到表单身份验证不会使其更安全。这意味着您将使用更标准化的身份验证机制,以便更轻松地审核您的软件以解决与身份验证相关的问题。

即使用户的 Session 过期(或应用程序池回收),FormsAuthentication 通常也能正常工作,因为它将用户数据存储在具有自己过期策略的加密 cookie 中。

【讨论】:

    【解决方案2】:

    您不应在没有 SSL 的情况下处理用户凭据或其他敏感数据。

    无论您是否使用 SSL,发布的数据始终可以从客户端看到,并且始终可以“伪造”。 SSL(如果使用得当)可以防止“中间人”监听通信,但重要的是要意识到如果不严格实施它几乎没有用处,因此您还应该考虑使用@987654321 @,即使不是所有浏览器都支持。

    会话 ID 未“加密”,但会话 ID(实际上)不能“猜测”。 HTTP(S) 是无状态的,您无法确定来自某个客户端的请求本身是否是恶意的。任何请求都会携带来自客户端的所有 cookie,无论是否加密(当然,如果 cookie 中的数据是加密的,则很难伪造其内容)。

    可以而且应该做的是尝试保护 cookie 不逃逸其正确的上下文,例如受制于XSS 和 CSRF 攻击。 FormsAuthentication 默认仅将 HTTP 用于其 cookie。为确保您网络上的所有 cookie 仅是 HTTP,请将以下内容放入您的 web.config:

    <httpCookies httpOnlyCookies="true" />
    

    为确保所有 cookie 都绑定到安全连接,请使用:

    <httpCookies requireSSL="true" />
    

    现在,您应该在自己之前使用表单身份验证的主要原因是它是一个经过验证的解决方案。在OWASP Top 10 中,损坏的身份验证和会话管理不是第二个问题,只是因为它比您想象的要正确。

    Forms 身份验证还增加了非常可配置的好处,并且可以正确加密存储中的用户凭据(如果您告诉它这样做)。鉴于现代基于 GPU 的暴力破解的可能性,标准实现绝不是万无一失的,但至少它没有做错。

    如果您想了解更多关于标准实现如何开展业务的信息,您可以使用任何免费提供的反编译器。

    【讨论】:

    • 当您说发布的数据始终从客户端可见时,您的意思是如果我使用或不使用 SSL,在我的机器上运行的提琴手将始终向我显示未加密的请求正文。但是,如果有人在服务器上安装了提琴手,我会从我的浏览器中点击,如果没有 SSL,他们会看到我的请求正文,但如果使用 SSL,他们会看到是否加密?
    • 这就是理论,是的。实际上,与 CRIME、BEAST 或 Lucky 13 一样,“安全”连接可能仍会受到损害。从可以应用压缩和其他修改的意义上说,SSL 并不是一个统一的标准,当发现缺陷时反过来会被利用。这是关于该主题的许多有趣且相当近期的新闻文章之一:arstechnica.com/security/2013/03/…。与往常一样,安全是关于降低风险,我们必须降低风险——我们不太可能很快看到“安全”的网络,除非是相对意义上的。
    • 我知道我可能误读了您的评论,所以为了清楚起见——我所说的“理论”是,如果流量通过 SSL 保护,则应该不可能窃听。附带说明一下,使用数字签名可以确保任何数据(加密或未加密)在发送者和接收者之间的传输过程中都没有被更改。
    【解决方案3】:

    Forms 身份验证使用 FormsAuthentication 对象为用户设置 cookie。 cookie 包含用户的识别信息。我不确定该 cookie 是否仅适用于 HTTP,因为仅 HTTP cookie 仅在服务器上可用,而不是在客户端上可用。这些 cookie 在服务器上被解密,它会获取您的用户 ID 等。

    因此,如果它不是仅 HTTP 的 cookie,则可能会出现问题,除非信息已加密,因此用户必须解密并知道底层密钥。会话 我认为只有会话 ID 被安全跟踪,​​而不是实际信息。用户的信息仍然存储在服务器上。

    最后,现在人们提到的第一个也是最重要的防御是 SSL。你可以从我找到的东西中以低至 10 美元的价格获得证书......

    【讨论】:

    • 当我看到在提琴手的饼干,我看到它包含此:.ASPXFORMSAUTH_Test = BE08825FDBCD2B2679CDBA0095CCECXBE5117A7BC81022C5C142870B6576B943C4984F362318D5121FB28F644AE9B7EDC957F537AB83A839BA0511BB068AFFE067175A9D538F7B3C96DE8E22F0A3D8B4A6DB631298DD26607D8A72B1081979BBAB02D8CE8908C88A9CDE8EB8C26F709EAF7B376C59DBA227467C974CDDC634K6,我猜是加密的数据,你知道那是什么,它只是SessionID的?我仍然在 Fiddler 中看到打开的请求正文,但看起来它是 ViewState,猜测保护它的唯一方法是通过 SSL。
    • 是加密数据。注意 表单身份验证与 Session ID 无关,因此 SessionID 不参与其中。 Viewstate 的本质也是加密的。加密不是 100% 完美的,但非常非常难以破解,并且可能只有一小部分非常熟练并愿意花费大量时间来破解它的人才能破解。更常见的是,有人可能会尝试暴力攻击或重放攻击。
    猜你喜欢
    • 2010-12-01
    • 2011-04-13
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多