如何做一个安全的“记住我”功能 – 文章

有一个场景中,一个用户登录并访问您的网站,但第二天他又来了。,但必须重新登录。于是就有了“记住我”这样的功能来方便用户使用,然而,有一个不言而喻的东西,也就是说,这种身份验证状态的持久状态已经存在。。这意味着,他们可以关闭浏览器,然后关闭计算机,下周或下个月,甚至不再回来,只要这个区间是太离谱,网站会知道谁是谁,并一如既往的为他们提供所有相同的功能和服务——与许久前他们离开的时候别无二致。

我说的是这个小家伙:

那当然不是很聪明很好。,但你会看到,即使正确使用,一个表可以导致的悲剧不是偶然的,你可以有一辆车准备告诉你它是如何弄的一团糟。让我们从问题的根源入手。。

反模式

乍看起来似乎很明显。,就是说“记住我”功能的应用其实是非常基本的,不是那种很神秘的东西,事实上,不是吗?。

下面我将解释这两种反模式的案例与问题,谈谈如何做是正确的。第一个例子,如图所示,当你登录:

这都是很标准的,但一个有趣的事情发生在登录后,让我们看一看在饼干:

这个饼干是很可怕的。,特别是选定的黄色高亮部分。。如果你没勾选“记住我”的话,这些可怕的信息将不被记录的饼干,所以,只是为了方便用户重新审视原有的功能。在图中,我的电子邮件地址是赤裸的,但不是明文密码。但不要太激动,在看似无懈可击的加密特征看……咦?等一下,这是不是一个base64编码!关于Base64编码,这是一个完整的编码和解码可以,这意味着你可以去哪个编码转换网站做F:

不是所有的Base64加密(当然,有的人真会用它来加密重要信息),虽然它真的是一种合理的方式取代ASCII,但事实上,密码编码只是刚刚进入浏览器即时。你可能会质疑道 – 这能有多大问题?无论如何它只是存储在自己的浏览器里,怎么可能呢?黑客能在地球上得到它吗?

下面我将介绍两个非常简单的方法,第一次提到的内容和上面说的对。Black&Decker暴露了ELMAH日志,在这些日志的存在完全没有内部服务器的配置,排除的内容是成千上万次记录的内容。但当常式记录异常,在程序的执行之前,系统会记录下所有的请求,这意味着这些内容都进入了饼干。想象一下,一个数量庞大的过滤内容全是转换了,这是相当于具有一个数据库用户凭据。当然这个问题已修复,但这是一个很好的例子,如何使一个非常简单的配置错误,使用方便。

接下来是另一个问题:

这个网站是Aussie Farmers Direct(以下统称为AFD网),是一个典型的形式登陆。再看日志,并且让网站“记住我”,再看看饼干:

好家伙,情况一样,即使是Base64编码不加。说这是不好的,看,你可以这样做:

XSS的JSON饼干吗?当然,这样玩,这样一来,如果你的密码被更改,它不改变,当你再次登录时。,它试图登录的旧密码。嗯?

AFD没有显示其良好的PHP(常式日志!但他们还有其他风险,比如XSS。另一件事有关的网站,这些密码都存储在cookie中未标记为类,你可以看到上面的cookie列表右侧。这意味着,客户端可以访问这些cookie脚本,这是只要你能让XSS的成功,你可以允许其他用户负荷的XSS有效载荷,Cookie包含密码被盗,(这样做有很多有效的方法)。HttpOnly属性的缺乏也许是粗心,但问题的核心在于存储在cookie中的密码会很容易地通过其他途径疏漏出去。

还有一个更重要的原因,为什么这些网站也会在这方面疏忽?,虽然他们是保护他们的客户在其网站上的凭据。每当上述网站的客户勾选了“记住我”功能并向网站上发出请求时,当他们的用户名和密码发送到自己的邮箱网站,当他们经营易趣网或网上银行时。无论是密码明文,或者你可以通过客户端脚本,浏览器中的密码总是隐藏在大自然的外衣下。。很多人都对密码重用的习惯(一般),然而,对于那些爱死熊用户的责任,这是我们的开发。我不得不说,我们应对用户凭据的威胁时,需要保护的实施措施是远远超过的。

因此,应该意识到对于如何建立“记住我”功能上的真正误解,现在我们看看良性实践。

基于实际操作

实例

在安全界混,有一句话你应该很熟悉,你不试试使用公认的最棒的就行了。这种话听在加密和认证非常容易,也可以在工程中的应用,从进一步的研究细节。

在Visual Studio 2012 MVC 4施工现场,你会看到这:

其他的标准框架还有其他的模式来实现这个功能。,但这更可能是一个参考。。当我们提交上述表单登录,并且不要求“记住我”,下面的饼干被成功验证,结果返回:

Set-Cookie:.ASPXAUTH=6891A5EAF17A9C35B51C4ED3C473FBA294187C97B758880F9A56E3D335E2F020B86A85E1D0074BDAB2E1C9DBE590AF67895C0F989BA137E292035A3093A702DEC9D0D8089E1D007089F75A77D1B2A79CAA800E8F62D3D807CBB86779DB52F012; path=/; HttpOnly

这是一个简单的身份验证cookie,和所有的HTTP数据绑定。这是我个人的饼干后发送,网站就每次都能知道这是我而且我已经被验证了。我们可以看得更清楚,比如当我们用Chrome’s Cookies collection的时候:

另外,第二个cookie是防伪标签。,为了防止CSRF攻击,这与我们的身份验证状态无关。。除此之外,还有别的饼干吗?。

现在,让我们勾选上“记住我”然后再次登录看看cookie的响应:

Set-Cookie:.ASPXAUTH=3A92DAC7EFF4EE5B2027A13DD8ABEA8254F0A16D8059FCAF60F5533F1B7D99462DDF57320D069A493481978750526DF952D5C9EA0371C84F5CF1BFC0CCA024C2052824D4BA09670A42B85AEC7FFCB4088FC744C6C0A22749F07AF6E65E674A4A; expires=Tue, 02-Jul-2013 00:27:05 GMT; path=/; HttpOnly

你看到了吗?看铬的解剖:

我们现在有一个有效期为48小时的饼干,如果它是在一段时间内,这是关闭时,关闭浏览器,将被丢弃。让我们仔细看看。

cookie认证部分的时间

其实,这是一个简单可笑的安全结构。,我甚至觉得没有写的价值,看这里。:在这个例子中,“记住我”功能可以简单地归结为,它控制cookie的时间限制,决定一个人能使用多长时间。。

在上面的例子中,默认的会话cookie,或者换句话说,一个cookie,And there is no clear deadline,所以它将被迫到期时关闭浏览器。这是一种方法。,另一种是直接进入保质期短,即使浏览器继续使用Cookie,用户也将被自动取消。当然,你也可以控制这种行为对服务器,还可以扩展cookie身份验证的时间限制。,如果系统正在使用的服务器响应时间的增加。

只要保持cookie的有效性验证,特定的人就会被记住。那多久的时效才合适呢?上面的例子中默认为2天,但对合法的用户显然是有点太短暂。脸谱网可以持续一年。持续时间较短,意味着更少的风险,但更多的不便,持续时间长,也让用户更容易增加潜在风险。让我们仔细看看风险。

长期使用国家认证

当被认证之前,您的会话不能被劫持。。废话,这是当然的!但认真看的话,在这样的情况下,在上述的网络法,Cookie将在6个月内到期。,同时它没有HTTP只标记,这样一来他们网站的XSS漏洞可以为攻击者提供半年的时间去获取并使用用户的凭证。同样的情况,如果期限是1个月,他们仍然存在一些严重的漏洞。,但是攻击真相的机会被切断了。。

另一方面,百得网络有一个相对较短的周期。在他们的常式日志曝光的案例,还有一系列重大遗漏,但除非有人在一周前已经用“记住我”登录了网站,并触发默认配置漏洞,否则将凭据泄露。如果你想找一个网站自己试试看,即使你已经登录到网站,你也可以看到一个有时限的饼干。。

因此,如果您希望保护用户CR,则所有相关的验证cookie,类的安全属性是必要的和严格的安全态度。虽然所有的经典劫持的威胁仍然存在,不过,为了解决这些问题,饼干是绝对不能被忽视的。

归根结底,这是一个权衡,需要考虑的因素如攻击者要取得的数据的价值,加强用户和安全验证的负面影响。例如,脸谱网也有一些非常有用的社交用户数据,用户非常希望像响应速度无延迟,在自己的账户上大量投资的安全性。为AFD网络,在用户的个人识别数据和财务信息,提供用户所需的安全验证服务,用户可以看到本身也是一个相关的安全意识。他们有着完全不同的风险,这两个网站应该完全不同的饼干金时间。

强化

也许有的同学会认为COOKIE是无解的,总是有一个更好的解决方案,涉及安全的事情,但这是个代价。,安全取决于你是否愿意付出时间、金钱、便利性,但总会有人告诉你,你做错了。!让我们把一些可能的加固方法使用验证一下。

对于一个长期有效的COOKIE,问题在于他们需要有效地保持用户身份的验证和面对如CSRF或clickjacking等攻击风险。当然,有许多风险需要使用术语cookie而不列出。,但这并不影响围绕防范方法的讨论。另一点是,当一个特殊的cookie为用户提供高效,它还可以重新打开另一个身份验证会话作为返回。。虽然最初的会议将很快到期,但关键是要启动新的会话,它会因为用户勾选了“记住我”并再次登录而进行另外的验证。

一种验证方式包括利用用户的IP地址/用户代理/其他显著特点来限制“记住我”的cookie。这可以提供一些防御的cookie劫持。当然,在使用法律的情况下,使这些变化。特别是,这是不常见的移动网络的访问一个网站。您的ISP并不总是提供静态IP地址。。至于用户代理,在浏览器的差异,如Chrome和Firefox的更新几乎是每隔一天。但是如果你想选择一些优质代理商,否则,代理将是一个危险的方法。

还有一个程序的编程,就是保持“记住我”cookie和身份验证cookie的分离,使用前验证用户的身份,但是要对额外的东西施加一些限制。。实际情况是,对一个身份自动认证过程,确保遵守安全模型。结果是,缓解措施,它将在自动验证,再问到用户凭据。这不是创新,举例来说,您可能是在网上银行汇款遇到这样一个。在这里,我们面对的是,经过身份验证的用户的风险,因为这种方式很容易被劫持和欺骗。

至于其他方法,以加强,我们可以在“记住我”cookie被使用后进行复位。This is tantamount to make it invalid in the server,你需要一个独特的和持久性cookie值,例如,在cookie和数据库之间的随机数中。这是为了确保cookie不是攻击者在获得。在本文中,关于这种模式的缓解方法作者。但是,你需要付出一些额外的工作,并在某种程度上给正常的用户带来不便(例如用户无法跨越多个电脑使用并“记住”自己的凭据)。

最后值得一提的是,管理原则同一帐户下,它需要我们去关注并且和“记住我”功能有关。例如,允许单一用户的多个会话同时验证?或者用户一旦更改了密码要不要将会话断开?管理员可不可以结束验证会话?出现了各种各样的问题,但在这里我要讨论的是如何恢复。

什么时候不该用“记住我”功能?(以及一些替代功能)

有时候,允许经过身份验证的用户保持较长的认证状态。例如,银行,在常规的使用,当你想要地图自动登录,当你离开的时候,左边有一个浏览器注销后,多大的风险,我不说了。

但事实上,仍有一些中间立场可以采取以下方法:

登录框看起来不那么弱,当你用“记住我”登录过后,当回访,网站会话过期,你会看到:

我不喜欢这个名字。,因为它是在三个月的cookie等数据。坦白地说,它这样做是没有意义的,因为记得难啊!

但是,这是不是所有的不积极,这是一个灰色的中间区域。例如,假设在通过“记住我”功能恢复会话时,重新认证是在主的过程中开始的。。这或许是一个两全齐美的做法。

总结

这也不例外。,总有一些功能,似乎是个好主意,它通常是很容易做的很好,至少对于大多数的项目。坦率来讲,两例还莫名其妙的头痛。,尤其是当你认为它最初是用来延长Cookie时间L。

另外,这篇文章的重点并不局限于分解“记住我”功能的安全结构,你可能能够解决自己的问题,cookie的凭据,但结合起ELMAH和缺少HTTP only属性以及XSS漏洞的情况考虑,提防不经意的行为,虽然它似乎是无害的,它可能导致严重的安全风险。。

no comments

Leave me comment