ASP.NET MVC 2编辑模型是否包含Id?安全Id未被篡改
在ASP.NET MVC应用程序中创建编辑器和更新数据时,我正在寻找一些最佳实践。假设我有一个类似于so/Post/Edit?Id=25的Url 我确保用户有权在Get请求中按Id编辑特定帖子,并在控制器中编辑我的帖子。我正在使用ValidateAntiForgeryToken 问题:我应该在EditModel中包含Id属性吗?如果是,我应该加密它吗 问题是我可以使用FireBug编辑Id hiddedinput并编辑不同的帖子,只要我有权限这样做。这并不可怕,但似乎是错误的ASP.NET MVC 2编辑模型是否包含Id?安全Id未被篡改,asp.net,security,asp.net-mvc-2,Asp.net,Security,Asp.net Mvc 2,在ASP.NET MVC应用程序中创建编辑器和更新数据时,我正在寻找一些最佳实践。假设我有一个类似于so/Post/Edit?Id=25的Url 我确保用户有权在Get请求中按Id编辑特定帖子,并在控制器中编辑我的帖子。我正在使用ValidateAntiForgeryToken 问题:我应该在EditModel中包含Id属性吗?如果是,我应该加密它吗 问题是我可以使用FireBug编辑Id hiddedinput并编辑不同的帖子,只要我有权限这样做。这并不可怕,但似乎是错误的 任何帮助都会很好
任何帮助都会很好 我想你不必担心,如果用户按照你说的做了,我想你会知道谁编辑了什么,所以如果他按照你说的那样编辑了错误的帖子,你总是可以删除他的编辑权限
如果你不能节约你的用户,不要让他们编辑任何东西…有几种方法可以防止这种情况 第一,根本不要向客户端发送敏感数据。将post id保留在会话变量中,以便用户永远无法编辑它。这可能是一个选项,也可能不是,取决于您的体系结构 下一种方法是将直接引用转换为间接引用。例如,您应该发送不透明列表{1,2,3},而不是向客户端发送postids={23452、57232、91031}以呈现下拉列表。只有服务器知道1表示23452,2表示57232,依此类推。这样,用户就不能修改任何您不希望他修改的参数 最后一种方法是包含某种哈希值,作为完整性检查进行添加。例如,假设html页面中有3个隐藏字段-{userId=13223,postId=923,role=author}。首先对字段名进行排序,然后将值串联起来,得到一个字符串,如
postId=923&userId=13223&role=author
。然后,将服务器机密附加到此字符串,并对整个字符串进行散列(SHA-1或MD5)。例如,SHA-1('postId=923&userId=13223&role=author&MySuperSecretKey')
。最后,将此散列值添加为隐藏参数。您可能还需要添加另一个名为ProtectedParameters=userId、postId、role
的隐藏字段
当发出下一个请求时,重做整个过程。如果散列值不同,则阻止进程
就安全性而言,我已按降序列出了选项。同时,它可能是在增加方便的顺序。您必须为您的应用程序选择正确的组合。与其说我“不能”,不如说我不应该。我不认为这个网站只是信任每一个用户,但仍然允许每个人编辑他们的帖子和评论。