Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 2编辑模型是否包含Id?安全Id未被篡改_Asp.net_Security_Asp.net Mvc 2 - Fatal编程技术网

ASP.NET MVC 2编辑模型是否包含Id?安全Id未被篡改

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并编辑不同的帖子,只要我有权限这样做。这并不可怕,但似乎是错误的 任何帮助都会很好

在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
的隐藏字段

当发出下一个请求时,重做整个过程。如果散列值不同,则阻止进程

就安全性而言,我已按降序列出了选项。同时,它可能是在增加方便的顺序。您必须为您的应用程序选择正确的组合。

与其说我“不能”,不如说我不应该。我不认为这个网站只是信任每一个用户,但仍然允许每个人编辑他们的帖子和评论。