Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何防止用户修改cookie值_Asp.net Mvc_Security_Authentication_Cookies_Encryption - Fatal编程技术网

Asp.net mvc 如何防止用户修改cookie值

Asp.net mvc 如何防止用户修改cookie值,asp.net-mvc,security,authentication,cookies,encryption,Asp.net Mvc,Security,Authentication,Cookies,Encryption,我将ItemId值存储在cookie中,以跟踪用户当前选择的项。这个ItemId不是敏感数据,我不在乎用户是否能看到它的值。大多数页面都需要访问该值,这就是为什么决定将该值保存在cookie中而不是数据库中。如果它在数据库中,我就不会有这个问题 问题是,用户可以将cookie ItemId修改为另一个用户ItemId,然后他们就有可能对其他人的项目执行操作。除非我根据数据库验证cookie值,以确保它对登录的用户有效。这意味着对数据库的点击破坏了将值放入cookie的目的 基本上,我的问题是如何

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

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

基本上,我的问题是如何防止用户修改cookie,或者至少知道它被修改了?我知道.NET表单身份验证cookie存储用户id和角色数据,因此它们显然存在相同的问题

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

也许我应该改走db路线


谢谢。

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

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

标准答案是“浏览器中的任何数据都不可信”

没有

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

对。这就是解决办法

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

在数据库命中时为True,但与此无关,因为数据库具有缓存

然而,cookie仍然有一些价值


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

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

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

此ItemId不是敏感数据

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

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

您应该使用的唯一cookies是:

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

  • 身份验证令牌-一个随机的多字符(比如100位长)字母数字字符串,一旦散列,必须与数据库中所述用户ID的存储值相匹配

  • 查看首选项cookies-无关紧要的小cookies,例如选择要为客户端服务的CSS主题,或者显示的数据是否应按A-Z或Z-A排序,等等。这些内容如果已清除,则无关紧要,对客户端或任何其他用户都没有重大影响


另外,不要担心在每次加载页面时“命中”数据库。这就是数据库的设计目的。我想不出哪怕是一个现代化的专业网站,它都会为每个页面浏览量查询数据库。

那么加密后的下一步是什么呢?最大值是什么?我确实考虑过使用.NET会话框架,但是它必须是基于SQL的,才能在Web农场环境中工作。因此,在这一点上,我编写代码以在db中管理它没有太大区别。@Aros:“我编写代码没有太大区别”。区别在于这个问题。如果你使用这个框架,你就不需要问这个问题了,是吗?您已经完成了,可以花时间为您的用户做更多有用的事情。我知道db解决方案,问题的重点是更好地理解在试图最小化db命中的场景中保护cookie的选项。完成任务很重要,但我还想确保我了解自己的选择,以及为什么最好以一种方式实现它。@Aros:不要“最小化数据库命中”。其他人所做的标准解决方案是对照数据库检查cookie是否有效。除非(有效地)取出长寿命的锁,否则没有其他选择;当用户的浏览器断开连接时,您会被强制清理的锁卡住。“确保我了解我的选择”并不是在已经解决的问题上浪费时间的好借口。