我的网络应用程序的主页有一个 记住账号 复选框。如果用户检查它,我会将电子邮件 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 中并不安全,因为它们以纯文本形式提供。

查找有关 cookie 的一些答案的好地方是 饼干中心。 对于会员资格,通常使用带有称为“令牌”的长字符串的 cookie,当您提供用户名和密码时,该 cookie 从网站发出。有关该过程的更多信息,您可以在此处找到 文章。在 ASP.NET 中使用表单身份验证时,您可以像这样设置身份验证 cookie:

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);

第二个参数用于“记住我”功能 - 如果为 true,它将创建持久 cookie,该 cookie 将在您离开网站后持续存在。您还可以像这样以编程方式操作 cookie:

HttpCookie authCookie =
  HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

其他提示

不!不要将密码存储在 cookie 中!

在 ASP.NET 中,使用

FormsAuthentication.SetAuthCookie(username, true);

第二个参数的值确定 cookie 是否持久(记住我复选框的值)。

不,不是远程安全的。您无法保证 cookie 不会以纯文本形式存储(事实上,大多数实现 将它们存储为纯文本)。

请注意,“记住我”本质上是不安全的,因为任何拦截 cookie 的人都可以访问该应用程序。但暴露用户密码会使不安全的情况进一步恶化。:-) 如果用户发现的话,可能会让他们非常生气。

我使用加密的 cookie 字符串,其中包含用户的帐户名和令牌,该令牌除了在我的服务器上的表中之外,没有以任何(其他)方式与用户的帐户关联。当用户返回站点时,我们解密 cookie 并查找该令牌是否确实与该帐户关联。令牌(以及 cookie)会更改每次自动登录,并使用于该自动登录的令牌无效。(令牌和帐户之间存在多对一关系,以允许从多个位置自动登录。如果您愿意,您可以对此进行限制。)如果在 X 天内未使用令牌,则会超时。(这不仅是通过限制 cookie 的持续时间来实现的;它也是在服务器端完成的。)我还添加了一些其他东西来使生活变得更加轻松 少量 对于试图解码 cookie(已成功解密)或使用被盗 cookie(不需要解密)的人来说,这是很困难的,但没有必要过度杀伤(再次强调,“记住我”本质上是不安全的)。

我在一个并不真正需要强大的安全性(显然)并且拥有大量动态 IP 客户端的网站上使用它,因此我不会尝试将其锁定到某个 IP。但即使将其锁定到 IP 也并不能保证其安全,它只是稍微减少了攻击面。

您可能想知道为什么我的 cookie 中有用户名。出于直接“记住我”的目的,我不建议将其放在那里,即使它是加密的(毕竟,它是用户名+密码系统中身份验证对的一半)。当我查看格式并提醒自己我们是如何解决这个问题时,我有点惊讶地在我们的 cookie 中发现了它;但后来我看到评论解释了为什么它在那里,并且有一些与“记住我”无关的原因(不一定是 有说服力的 事后看来,但原因)。

最后一点,“记住我”本质上是不安全的,这是站点日志非常重要的众多原因之一,也是为什么您应该在允许更改重要帐户信息的过程中要求密码重新验证(以使更难有人窃取了 cookie 以取得该帐户的所有权)。

这是你永远不应该做的事情,因为很容易更改 cookie 的值并将其发送回服务器。即使在 cookie 中存储“用户以‘naivists’身份登录”也是错误的,因为我可以将其更改为“用户以‘Pandiya Chendur’身份登录”。

您可以在 cookie 中做的就是向客户端提供信息,即使这些信息发生更改,对服务器来说也没有意义。例如 - 最喜欢的颜色、首页布局等等。

您可以向他们提供存储在 cookie 中的会话 ID,因为如果他们将值更改为其他值,他们就无法为自己做任何更好的事情(除非他们知道来自另一个会话的有效会话 ID)。

微软的MSDN是什么 关于使用 cookie 的说明:

Cookie的安全问题类似于从客户端获取数据的安全问题。在您的应用程序中,cookie是用户输入的另一种形式,因此需要检查和欺骗。用户最少可以查看您在cookie中存储的数据,因为cookie可以在用户自己的计算机上使用。用户 还可以在 浏览器将其发送给您。

您切勿将敏感数据存储在cookie中,例如用户名,密码,信用卡号等。不要将任何东西都放在用户或可能以某种方式窃取cookie的人手中的饼干中。

同样,也要怀疑 从 cookie 中获取的信息。不要认为数据是 和你写出来时一样;使用 在使用 cookie 时采取同样的保护措施 值,就像您使用 用户在网页上输入的内容。"(《世界人权宣言》) 本专题前面的例子表明 对 cookie 内容进行 HTML 编码 在页面中显示该值之前、 就像在显示任何 用户提供的信息。

Cookie 在浏览器和 服务器作为纯文本,任何人 拦截你的网络流量 读取 cookie。您可以设置 cookie 属性,使 cookie 只有在连接 使用安全套接字层(SSL)。SSL 不会保护 cookie 免受 读取或操作时 在用户的计算机上,但它确实 防止读取 cookie 在传输过程中,因为 cookie 加密。更多信息,请参见 网络安全基本做法 应用。

将密码存储在 cookie 中并不安全,因为它们以纯文本形式提供。但如果您的首选标准是这样做或有任何用户要求,您可以通过加密字符串来实现。这可以使这足够安全。

但不建议这样做,

我认为您需要使用用户名和从 Windows Identity 获得的加密身份验证字符串创建一个令牌。无需在 cookie 上存储密码。我们有存储用户名和经过身份验证的字符串的应用程序

顺便说一句,存储密码并不在任何地方都是安全的,无论是客户端还是服务器端。

你不需要这样做。

什么 布拉尼斯拉夫 说,并且……

除了不要将敏感数据放入 cookie 之外,您还应该通过在 web.config 中至少放置以下内容来保护它们:

<httpCookies httpOnlyCookies="true" />

欲了解更多详情,请参阅: 到底如何在 ASP.NET 中配置 httpOnlyCookies?

它一点也不安全。Cookie 存储在客户端计算机中,可以被篡改。

  • 如果您在传输任何安全信息时使用 SSL,则可以避免第三方监听您的网络流量。无论将用户凭据存储在 cookie 中,这都是同样的问题,因为当他们登录时,您无论如何都会将其用户名和密码发送到服务器,我假设服务器对其进行哈希处理,并将其与您为该用户拥有的哈希密码进行比较。

  • 由于跨域,其他域将永远无法读取您的 cookie,因此这不是问题。

  • 因此,如果您想称之为“安全漏洞”,那么实际上唯一的“安全漏洞”是某人物理上访问了他们的计算机。如果发生这种情况,他们很可能会从那个人那里得到任何想要的信息。当 chrome 自动为您填写登录表单时,您如何解释,这安全吗?我确信他们不会以纯文本形式存储它,但这并不重要。如果您转到 Chrome 自动填充的页面,您只需从表单中复制密码即可查看您现在拥有该人的密码。

  • 这实际上取决于您需要它的“安全”程度。我同意用过期时间作为令牌来加密用户信息是验证服务调用的最佳方式,并且它提供了灵活性。我只是没有看到在 cookie 中存储登录凭据的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top