如何防止用户修改cookie值

时间:2011-06-03 17:32:36

标签: asp.net-mvc security authentication cookies encryption

我在Cookie中存储ItemId值以跟踪当前所选用户的项目。这个ItemId不是敏感数据,我不在乎用户是否可以看到该值。需要在大多数页面上访问此值,这就是为什么决定将值保留在cookie而不是数据库中的原因。如果它在db中我不会有这个问题。

问题是用户可以将该Cookie的ItemId修改为另一个用户ItemId,然后他们可能会对其他人的项目执行操作。这是除非我验证数据库的cookie值以确保它对登录的用户有效。这意味着命中数据库会破坏将值放入cookie的目的。

基本上我的问题是如何阻止用户修改cookie或者至少知道它被修改了?我知道.NET表单身份验证cookie存储用户ID和角色数据,所以他们显然有同样的问题..

我最初的想法是加密cookie中的值。我知道cookie仍然可能被劫持,但这至少会阻止篡改它的价值吗?

也许我应该改为使用数据库路径?

感谢。

4 个答案:

答案 0 :(得分:2)

标准回答“没有来自浏览器的数据是值得信赖的”。

无。

  

验证数据库的cookie值,以确保它对登录的用户有效。

正确。这就是解决方案。

  

这意味着对数据库的命中击败了将值放入cookie中的目的。

数据库命中为真,但不相关,因为数据库有缓存。

然而,cookie仍然有一些价值。

>的用途是使用维护会话的框架并使用会话来跟踪此情况。不是你自己发明的饼干。

答案 1 :(得分:1)

OP中的以下两个引用相互矛盾:

  

此ItemId不是敏感数据

  

问题是用户可以将该Cookie的ItemId修改为另一个用户ItemId,然后他们可能会对其他人的项目执行操作。

你问题的整个前提很差。我不能告诉你如何阻止用户修改cookie值,因为你永远不应该信任客户端发送的任何东西。始终假设客户端将始终修改cookie值。其他任何东西都是非常糟糕的设计。

您应该使用的唯一Cookie是:

  • 用户令牌 - 一个随机的多字符(比如10位长)字母数字字符串,它与数据库中的实际用户ID相关。

  • 身份验证令牌 - 一个随机的多字符(比方说100位长)字母数字字符串,经过哈希处理后,必须与数据库中所述用户ID的存储值匹配。< / p>

  • 查看偏好Cookie - 无关紧要的小Cookie,例如选择要向客户端提供的CSS主题,或者呈现的数据是否应按AZ或ZA排序等如果它被清除并且对客户或任何其他用户没有重大影响,则无关紧要。

P.S。不要担心每次加载页面时“点击”数据库。这就是数据库的设计目标。我甚至想不到一个现代专业网站没有为每个页面视图查询数据库。

答案 2 :(得分:0)

如果您一直担心cookie值被篡改,那么我会认为它足够灵敏,至少被加密。

获取密钥,初始化向量并在将cookie发送到客户端之前对其进行加密。您唯一的其他选择是数据库,但您仍需要一些唯一标识用户的方法(阅读:会员提供商)

答案 3 :(得分:-3)

我决定使用MD5哈希来验证用户是否没有篡改cookie值。