在cookie中存储密码是否安全?
我的Web应用程序的主页有一个RememberMecheckbox。 如果用户检查它,我将存储电子邮件ID和密码在Cookie中。 这是我的代码:
if (this.ChkRememberme != null && this.ChkRememberme.Checked == true) { HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text); cookie.Expires.AddYears(1); Response.Cookies.Add(cookie); }
我想知道的是:
- 在cookie中存储密码是否安全?
- 什么是适当的方式做同样的事情?
- 为cookie设置时间的最佳做法是什么?
将密码存储在Cookie中是不安全的,因为它们以纯文本forms提供。
Cookie Central是一个很好的findCookie的答案。 对于成员资格,通常会使用一个名为“token”的长string,当您提供用户名和密码时,该string将从网站发出。 更多关于你可以在这篇文章中find的过程。 在ASP.NET中使用表单身份validation时,您可以像这样设置身份validationCookie:
FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);
第二个参数用于“记住我”function – 如果为true,它将创build持久的cookie,在您离开网站后将持续。 您也可以像这样以编程方式操作cookie:
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
没有! 不要在cookie中存储密码!
在ASP.NET中,使用
FormsAuthentication.SetAuthCookie(username, true);
第二个参数的值决定了cookie是否持久(记住我的checkbox的值)。
不,不是安全的。 您不能保证cookie不以纯文本格式存储(事实上,大多数实现将它们存储为纯文本格式)。
请注意,“记住我”本质上是不安全的,因为拦截cookie的任何人都可以访问应用程序。 但暴露用户的密码使得它更加不安全。 :-)如果他们发现,可能会让用户非常生气。
我使用一个encryption的cookiestring,该string包含用户的帐户名称,除了在我的服务器上的一个表格中,还有一个与用户账户没有(其他)关联的令牌。 当用户返回站点时,我们解密cookie并查找该标记是否实际上与该账户相关联。 令牌(以及cookie)会改变每次自动login,并使用于该自动login的那个无效。 (令牌和帐户之间有多对一的关系,允许从多个位置自动login,如果您愿意,可以限制)。如果在X天内没有使用,则令牌超时。 (这不仅仅是通过限制cookie的持续时间来完成的;它也是在服务器端完成的)。还有一些其他的东西我扔在那里让有些人试图解码cookie(已经成功解密它)或使用一个被盗的cookie(不需要解密),但没有任何意义(过去,“记住我”本质上是不安全的)。
我在一个网站上使用这个网站,强大的安全性并不是真的必要(显然),而且有大量的dynamicIP客户端,所以我不会试图locking到一个IP。 但是即使将其locking到IP也不能保证安全,这只会减less攻击面。
您可能想知道为什么我在cookie中拥有用户名。 对于直接的“记住我”的目的,我不会build议在那里,即使它是encryption的(毕竟,它是用户名+密码系统中的authentication对的一半)。 当我提醒自己我们是如何为这个问题做的时候,看着格式的时候,我们有点惊讶地发现它在我们的cookie中。 但是后来我看到了解释为什么在那里的意见,而且还有一些与“记住我”无关的原因(事后看来不一定有说服力的原因,只是原因)。
最后一点,“记住我”本质上是不安全的事实是网站日志非常重要的原因之一,为什么在允许更改重要的帐户信息的过程中需要密码重新validation(为了使其更难有人窃取了cookie来取得账户的所有权)。
这是你永远不应该做的事情,因为改变一个cookie的价值很容易,并发送回服务器。 即使存储“用户被作为'naivists'在一个cookie中是错误的,因为我可以把它改为”用户login为'Pandiya Chendur'“。
你可以在cookies中做的是给客户提供的信息,即使被改变,对服务器来说也是没有意义的。 例如 – 最喜欢的颜色,首页布局等等。
你可以给他们存储在一个cookie中的会话ID,因为如果他们把值改成别的东西(除非他们知道来自另一个会话的有效会话ID),他们就不能为自己做出更好的select。
微软MSDN 有关使用cookies的说法 :
Cookie的安全问题与从客户端获取数据的问题类似。 在您的应用程序中,Cookie是用户input的另一种forms,因此需要进行检查和欺骗。 用户至less可以查看存储在cookie中的数据,因为cookie可在用户自己的计算机上使用。 用户还可以在浏览器发送给您之前更改cookie。
您不应该将敏感数据存储在cookie中,例如用户名,密码,信用卡号码等。 不要把任何东西放在不应该放在用户手中的cookie上,或者放在可能以某种方式窃取cookie的人手中。
同样,要怀疑你从cookie中获得的信息。 不要以为数据和写出来的数据是一样的; 在处理cookie值时使用相同的安全措施,您可以使用用户input到网页中的数据。 本主题前面的示例显示了在显示页面中的值之前对HTML内容进行HTML编码的方式,就像您在显示从用户处获得的任何信息之前一样。
在浏览器和服务器之间以纯文本forms发送Cookie,任何可以拦截您的Webstream量的人都可以阅读该Cookie。 您可以设置一个cookie属性,该属性仅在连接使用安全套接字层(SSL)时才会传输Cookie。 SSL不保护cookie在用户计算机上时不被读取或操作,但它确实阻止cookie在传输过程中被读取,因为cookie被encryption。 有关更多信息,请参阅Web应用程序的基本安全实践。
将密码存储在cookie中是不安全的,因为它们以纯文本的forms提供。 但如果您的首选标准是这样做或任何用户要求是在那里,你可以通过encryptionstring。 这可以使这个安全。
但不build议,
我认为你需要创build一个带有用户名和密码的身份validationstring,你从Windows身份获得。 不需要在cookie上存储密码。 我们有我们的应用程序存储用户名和authenticationstring
顺便说一句,存储密码是不安全的,无论是客户端和服务器端。
你不需要那样做。
布兰斯拉夫说什么,而…
除了不把敏感数据放入你的cookies中,你还应该通过在web.config中至less放置以下内容来保护它们:
<httpCookies httpOnlyCookies="true" />
有关更多详细信息,请参阅: 如何在ASP.NET中configurationhttpOnlyCookies?
这完全不安全。 Cookies存储在客户端计算机中,可能会被篡改。
-
如果您使用的是您应该传输任何安全信息的SSL,这将消除第三方聆听您的networkingstream量。 无论将用户凭据存储在cookie中,这将是同样的问题,因为当他们login您的用户名和密码发送到服务器,无论如何,我假设服务器散列它,并将其与该用户的散列密码进行比较。
-
其他域名将永远无法读取您的Cookie,因为这是不是一个问题。
-
所以真的是唯一的“安全漏洞”,如果你想这样做,就是如果有人在物理上访问他们的计算机。 如果发生这种情况,他们最有可能得到任何来自该人的信息。 你如何解释什么时候chrome自动为你填写login表单,这是否安全? 我相信他们不是以纯文本的forms存储的,但这并不重要。 如果你去一个页面,铬自动填充你可以只复制密码的forms,看看你现在有这个人的密码。
-
这真的归结为你需要的“安全”。 我同意用过期作为令牌encryption用户信息是validation服务调用的最佳方式,并提供了灵活性。 我只是没有看到存储login凭据在cookie中的问题。