我的web应用程序的主页有一个RememberMe复选框。如果用户检查它,我将存储在cookie中的电子邮件id和密码。这是我的代码:
if (this.ChkRememberme != null && this.ChkRememberme.Checked == true)
{
HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text);
cookie.Expires.AddYears(1);
Response.Cookies.Add(cookie);
}
我想知道的是:
发布于 2010-01-20 17:51:59
将密码存储在cookie中是不安全的,因为它们是以纯文本形式提供的。
查找有关cookie的答案的一个好地方是Cookie Central. For membership,通常使用的cookie带有一个名为“token”的长字符串,当您提供用户名和密码时,该cookie是从网站发布的。有关您可以在此article中找到的进程的更多信息。在ASP.NET中使用窗体身份验证时,可以像这样设置身份验证cookie:
FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);
第二个参数用于“记住我”功能-如果为真,它将创建在您离开站点后持续存在的持久cookie。您还可以通过编程操作cookie,如下所示:
HttpCookie authCookie =
HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
发布于 2010-01-20 17:59:11
不是的!不要在cookies中存储密码!
在ASP.NET中,使用
FormsAuthentication.SetAuthCookie(username, true);
第二个参数的值决定了cookie是否持久(记住我复选框的值)。
发布于 2010-01-20 18:06:39
不,不是远程安全。您不能保证不会以纯文本存储(事实上,大多数实现都将cookie存储为纯文本)。
请注意,“记住我”本质上是不安全的,因为任何拦截cookie的人都可以访问应用程序。但是,暴露用户的密码会让它在不安全的阶梯上更进一步。:-),如果他们发现了,可能会让用户非常生气。
我使用一个加密的cookie字符串,它包含用户的帐户名和一个令牌,除了我的服务器上的一个表之外,该令牌与用户的帐户没有任何(其他)关联。当用户返回站点时,我们解密cookie并查找该令牌是否确实与该帐户相关联。令牌(以及cookie)会更改每次自动登录,并使用于该自动登录的令牌无效。(令牌和帐户之间存在多对一关系,以允许从多个位置自动登录。如果你愿意,你可以限制它。)如果令牌在X天内未使用,则会超时。(这不仅仅是通过限制cookie的持续时间来完成的;它也是在服务器端完成的。)对于试图解码cookie (已经成功解密)或使用偷来的cookie (不需要解密)的人来说,我还添加了一些其他东西,以使生活变得有点困难,但没有必要过度杀伤力(同样,“记住我”本质上是不安全的)。
我在一个网站上使用它,在这个网站上,健壮的安全性并不是真正必要的(显然),而且它有大量的动态IP客户端,所以我不会试图将其锁定在一个IP上。但是,即使把它锁定在一个IP上,也不能保证它的安全性,它只是减少了一点攻击面。
您可能想知道为什么我在cookie中有用户名。出于直接“记住我”的目的,我不建议将它放在那里,即使它是加密的(毕竟,它是username+password系统中身份验证对的一半)。当我在提醒自己如何解决这个问题时,我在我们的cookie中发现了它,这让我有点惊讶;但后来我看到了解释为什么它存在的评论,还有一些与“记住我”无关的原因(事后看来,不一定是有说服力的原因,而是原因)。
最后,“记住我”本质上是不安全的,这是站点日志非常重要的原因之一,也是为什么您应该在允许更改重要帐户信息的过程中要求密码重新验证的原因之一(以使窃取cookie的人更难获得帐户的所有权)。
https://stackoverflow.com/questions/2100356
复制相似问题