2013-05-14 53 views
5

我的工作,它使用Session变量来跟踪用户的应用程序,母版页上检查它的存在,否则敲出来登录。我想改变这个表单身份验证,因为我认为它更安全,数据被加密。是什么形式的认证来保护,而不是使用会话变量

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

这里是我使用的代码:在登录页面我试图手动创建的cookie

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

    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的请求主体显示所有提交的字段及其内容。

+1

不是你的问题的答案(我猜cookie值包含一些哈希信息,但不知道。)。无论如何,你不应该手动设置cookie。你应该依赖FormsAuthentication.SetAuthCookie。这里的一些细节:http://stackoverflow.com/a/15199149/1236044 – jbl 2013-05-14 14:50:20

回答

1

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

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

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

可以做什么以及应该做什么是尝试和保护cookie免于逃避适当的上下文, XSS和CSRF攻击。默认情况下,FormsAuthentication仅针对其Cookie使用HTTP。为了确保您的网页上的所有Cookie的HTTP只,放在你的web.config以下:

<httpCookies httpOnlyCookies="true" /> 

为了确保所有Cookie绑定到一个安全的连接,使用:

<httpCookies requireSSL="true" /> 

现在,主要原因是您应该先使用Forms身份验证,这是一种经过验证的解决方案。 OWASP Top 10中破坏的认证和会话管理不是2,仅仅是因为它比你想的要难。

表单身份验证还增加了非常易于配置的优点,并正确加密了存储区中的用户凭据(如果您告诉它)。根据基于现代GPU的暴力可能性,标准实现决不是防弹的,但至少它没有做错。

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

+0

当你说发布的数据总是可见的客户端,你的意思是如果我使用或不使用SSL,在我的机器上运行的提琴手将始终显示未加密的请求主体。但是,如果有人在服务器上安装了fiddler,而我没有使用SSL,他们会看到我的请求正文,但是如果使用SSL,他们会看到是否加密? – Paritosh 2013-05-14 15:52:05

+0

这就是理论,是的。实际上,与CRIME,BEAST或Lucky 13一样,“安全”连接可能仍然会受到影响。从压缩和其他修改可能应用的角度来看,SSL并不是一个统一的标准,并且当缺陷被揭示时,SSL又会被利用。这是关于这个主题的许多有趣和相当新闻的文章之一:http://arstechnica.com/security/2013/03/new-attacks-on-ssl-decrypt-authentication-cookies/。与往常一样,安全是关于减轻风险,并减轻我们必须 - 除了相对意义上的情况外,我们不可能很快看到任何“安全”网络。 – 2013-05-14 17:11:27

+0

我发现我可能误解了你的评论,所以要清楚 - 我所说的“理论”是,如果流量通过SSL进行保护,则不应该有可能被窃听。在附注中,使用数字签名可以确保任何数据(加密的或未加密的)在发送方和接收方之间的方向上都没有改变。 – 2013-05-14 17:26:16

1

表单身份验证使用FormsAuthentication对象为用户设置cookie。该cookie包含用户的标识信息。我不确定这个cookie是否仅仅是HTTP,因为只有HTTP的cookie只能在服务器上使用,而不能在客户端上使用。这些cookie在服务器上解密,它抓住你的用户ID等。

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

最后,第一个和最重要的防御,人们提到这些天是SSL。你可以从我发现得到便宜,因为10 $证书......

+0

当我看到在提琴手的饼干,我看到它包含此:.ASPXFORMSAUTH_Test = BE08825FDBCD2B2679CDBA0095CCECXBE5117A7BC81022C5C142870B6576B943C4984F362318D5121FB28F644AE9B7EDC957F537AB83A839BA0511BB068AFFE067175A9D538F7B3C96DE8E22F0A3D8B4A6DB631298DD26607D8A72B1081979BBAB02D8CE8908C88A9CDE8EB8C26F709EAF7B376C59DBA227467C974CDDC634K6,我猜是加密的数据,你知道那是什么,它只是SessionID?请求体仍然可以在Fiddler中看到,但看起来像是ViewState,猜测唯一的方法就是通过SSL来保护它。 – Paritosh 2013-05-14 15:00:30

+1

这是加密的数据。注意表单身份验证与会话ID无关,因此SessionID不会播放它。 Viewstate也是通过它的本质进行加密的。加密不是100%完美的,但非常非常难以打破,并且可能只能被一小部分非常熟练并愿意花费大量时间来打破它的人群打破。更常见的是,有人可能会尝试暴力攻击或重播攻击。 – 2013-05-14 16:21:21

2

切换的方法给窗体身份验证不会使它更安全。这意味着您将使用更加标准化的身份验证机制,以便审核您的软件是否存在与身份验证相关的问题。

而且FormsAuthentication通常能够甚至当会话过期的用户(或应用程序池回收),因为它存储了用户的数据与自己的过期策略工作在加密的Cookie。

相关问题