2009-11-03 187 views
1

我正在写一个数据库身份验证系统,用于我的Web应用程序,它在ASP.NET MVC中声誉如此。当有人授权时,应该将他的用户名保存在cookies中。仅仅使用HttpResponse.Cookies来保存其值为用户名的cookie是否安全?难道它不可伪造?身份验证Cookie

只保存用户名......这是正确和安全的方式吗?或者我应该保存整个用户对象(如果这实际上可能)?

谢谢你,对不起我的英文。

回答

5

不,保存用户名是非常不安全的,因为它可以很容易伪造。这里是我的指导原则:

  1. 使用令牌
  2. 哈希它存储在数据库中的令牌。
  3. 制作饼干HttpOnly

令牌可以由CSPRNG生成以确保自动登录cookie不能伪造。

将数据库中的令牌散列在数据库中可防止用户帐户被盗用。 (请记住,此时令牌与密码等效。)

仅限HTTP的Cookie可防止可能潜在窃取cookie的XSS攻击。

+0

什么是令牌? – 2009-11-03 16:01:26

+1

令牌是一个随机生成的数字或一段不可能猜到的文本。 – 2009-11-03 16:02:07

+0

谢谢,但我怎样才能做一个cookie HttpOnly? – 2009-11-03 16:04:29

0

如果您将用户名存储在cookie中,那么很容易让某人更改该用户名。

一个更好的方法是将一个会话ID(您已经生成)存储在cookie中,并将诸如用户名之类的东西挂在服务器上。

+0

会话ID和它的用户名/用户应该保存在数据库中吗? – 2009-11-03 16:03:38

+0

是的 - 所以你会使用会话ID作为一个表中的关键字,其中包含您需要的所有会话相关信息,例如用户。由于您生成的ID可能以GUID的形式存在,因此某人将无法通过修改Cookie值来伪造其他用户的会话。 – Andy 2009-11-03 16:08:57

1

不,将用户名保存在cookie中以标记其授权的用户不是正确的方式,而且绝对不安全。

将cookie编辑为别人的用户名非常容易,瞧!您现在被授权为该用户。

相反,您应该在cookie中存储一些不是特定于用户的信息,但是特定于用户会话。您可以从浏览器字符串中创建一个值(以某种方式对其进行加密以使其不太明显),并将值存储在cookie中和服务器上的会话数据中。当用户发送下一个请求时,您可以验证该值来自同一会话和相同的浏览器配置。

这当然不是完全安全的,因为您可以欺骗cookie数据和浏览器字符串,但比将用户名放在cookie中更安全,并且比只依赖会话ID更安全。

要获得真正安全的身份验证,您必须使用SSL。

0

使用内置的表单身份验证框架来处理HTTP传输的世界末日,并避免重蹈覆辙。 PS:在某人降级之前,请记住FormsAuthentication!=使用SqlMembershipProvider。