【发布时间】:2011-10-02 08:50:47
【问题描述】:
我想在会话期间使用 cookie 来存储 userId,这样可以避免不必要的数据库往返。这个 userId 用于访问一些用户特定的信息。由于 cookie 可以很容易地编辑,我现在关心安全问题。
为了禁止已登录的用户编辑他们的 userId 并访问其他用户的信息,我使用了一种非常简单的方法。我在 userId cookie 创建时刻添加了一个 cookie,它存储了一个哈希值。在散列时,我使用硬编码的 64 字节密钥。从 cookie 中检索 userId 时,始终会检查它是否与其哈希值匹配。
这基本上是我的代码:
public static int GetUserId(Page page)
{
int userId;
if (page.Request.Cookies["userId"] != null && page.Request.Cookies["userIdHashed"] != null)
{
string userIdHashed = page.Request.Cookies["userIdHashed"].Value;
string userIdCoockie = page.Request.Cookies["userId"].Value;
string coockie = (userIdCoockie + "945AFF2FD0F1D89B4B1DBEB1B0C5D3B8B5DCE000AAEA331EB0C3F3A68C3865EFA73BC6EBF30C8DF1AD6B9ECB7094DA5B0C1AF36B5BBD096E3D873E9589E3F664").GetHashCode().ToString();
if (userIdHashed == coockie)
{
userId = Int32.Parse(userIdCoockie);
}
else
{
throw new Exception("UserId does not match!");
}
}
else
{
userId = ...//here userId is being retrieved from the data base and than:
page.Response.Cookies["userId"].Value = userId.ToString();
page.Response.Cookies["userId"].HttpOnly = true;
string userIdHashed = (userId.ToString() + "945AFF2FD0F1D89B4B1DBEB1B0C5D3B8B5DCE000AAEA331EB0C3F3A68C3865EFA73BC6EBF30C8DF1AD6B9ECB7094DA5B0C1AF36B5BBD096E3D873E9589E3F664").GetHashCode().ToString();
page.Response.Cookies["userIdHashed"].Value = userIdHashed;
page.Response.Cookies["userIdHashed"].HttpOnly = true;
}
return userId;
}
所以我的问题是:
可以考虑这种方法吗 在这种情况下足够可靠吗?
如果不应该修改它以及如何或 我应该寻找不同的东西吗 (例如通过加密/解密 System.Security.Cryptography 作为 推荐here)?
还有一个问题:设置 HttpCookie.HttpOnly = true 以防止 javascript 访问 cookie 是否真的有意义,因为它也可以很容易地被用户修改?
更新
非常感谢 Kerrek SB 和 Darin Dimitrov 的回答,他们认为我自己尝试保护 cookie 是没有意义的,因为已经内置了保护机制来存储此类信息。回发。
建议的选项是:
- 使用 ASP.NET
cache(但我相信它通常应该 存储应该在用户之间共享的信息,所以我看 其他两个选项)。 - 将带有 userId 的自定义字符串添加到 UserData 部分
FormsAuthenticationTicket。 - 使用
Session State。
所以目前我正在后两者之间做出决定。
更改 FormsAuthenticationTicket 并不简单。此外,它不适用于无 Cookie 表单身份验证(如 here 所述)。
使用会话状态要容易得多,但它会影响性能,因为它将值存储在服务器内存中。然而,在我的情况下,它可能并不那么引人注目,因为我们只存储了 int 类型的 userId。
所以现在最后一个选项对我来说看起来好多了。但是,如果其他人可以评论和支持或批评所讨论的任何选项,我将不胜感激。
提前致谢!
【问题讨论】:
标签: asp.net security session cookies session-state