【问题标题】:How to prevent users from modifying cookie values如何防止用户修改 cookie 值
【发布时间】:2011-09-08 00:04:49
【问题描述】:

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

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

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

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

也许我应该改用 db 路线?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    此 ItemId 不是敏感数据

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

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

    您应该使用的唯一 cookie 是:

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

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

    • 查看偏好 cookie - 无关紧要的小 cookie,例如选择向客户端提供什么 CSS 主题,或者呈现的数据应该按 AZ 还是 ZA 排序等. 是否已清除无关紧要且对客户或任何其他用户没有重大影响的东西。

    附:不要担心在每次页面加载时“命中”数据库。这就是数据库的设计目的。我想不出一个现代专业网站为每个页面视图查询数据库。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        标准答案是“没有来自浏览器的数据是可信的”。

        无。

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

        正确。这就是解决方案。

        这意味着对数据库的打击破坏了将值放入 cookie 的目的。

        在数据库命中时为真,但无关紧要,因为数据库有缓存。

        不过,cookie 仍有一些价值。

        但是,您应该做的是使用一个框架来维护会话并使用会话来跟踪它。不是你自己发明的饼干。

        【讨论】:

        • 我确实考虑过使用 .NET 会话框架,但是它必须基于 SQL 才能在网络场环境中工作。所以到那时,我编写代码在数据库中管理它并没有太大区别。
        • @Aros:“我写代码的区别不大”。不同的是这个问题。如果你使用了这个框架,你就不需要问这个问题了,对吧?您已经完成了,可以花时间为您的用户做更多有用的事情。
        • 我知道 db 解决方案,问题的重点是更好地理解在尝试最小化 db 命中的情况下保护 cookie 的选项。把事情做好很重要,但我也想确保我了解我的选择以及为什么最好以一种方式实现它而不是另一种方式。
        • @Aros:不要“最小化 db hits”。其他人所做的标准解决方案是检查数据库以查看 cookie 是否有效。除非您(有效地)取出寿命很长的锁,否则别无选择;当用户的浏览器断开连接时,您就会被锁住,您不得不清理这些锁。 “确保我理解我的选择”并不是在已经解决的问题上浪费时间的好借口。
        【解决方案4】:

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

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

        【讨论】:

        • 那么加密后的下一步是什么?最大值是多少?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2016-07-05
        • 2019-07-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多