8

I'm working on an application which uses the Session variable to keep track of users, checking on the master page for it's existence otherwise knocking them out to login. I wanted to change this over to Form Authentication as I read it was more secure and the data is encrypted.

Can someone tell me what data is actually encrypted? I tried setting up Forms Authentication on my site, it works fine, users are being tracked properly and can't access pages without logging in. However, when I look at the Request Body, using Fiddler, I see all the forms fields and there content. Can't a hacker use that to change the data and resubmit the request, like they would with a cookie generated from a Session variable? This application is not using SSL, so I understand SSL would encrypt the body, but I thought that's what Forms Authentication would do also. Otherwise what does it encrypt, just the Session ID in the cookie?

Here is the code I was using:

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

in the login page I tried to manually create the 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));

I had also tried:

FormsAuthentication.RedirectFromLoginPage(txtEmail.Text, false);

eariler, got the same results, request body in Fiddler shows all fields being submitted and their contents.

4

3 回答 3

2

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

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

于 2013-05-14T15:23:48.697 回答
1

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

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

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

可以而且应该做的是尝试保护 cookie 免于逃避其正确的上下文,从而受到例如 XSS 和 CSRF 攻击。FormsAuthentication 默认仅将 HTTP 用于其 cookie。为确保您网站上的所有 cookie 仅是 HTTP,请在您的 web.config 中添加以下内容:

<httpCookies httpOnlyCookies="true" />

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

<httpCookies requireSSL="true" />

现在,您应该在自己之前使用 Forms Authentication 的主要原因是它是一个经过验证的解决方案。损坏的身份验证和会话管理在OWASP 前 10 名中排名第 2 ,仅仅是因为它比您想象的要正确更难。

Forms Authentication 还增加了非常可配置的好处,并在存储中正确加密用户凭据(如果您告诉它这样做)。鉴于现代基于 GPU 的蛮力可能性,标准实现绝不是防弹的,但至少它没有做错。

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

于 2013-05-14T15:46:22.650 回答
1

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

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

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

于 2013-05-14T14:44:35.690 回答