在 ASP.NET MVC 应用程序中创建 EditMoels 和更新数据时,我正在寻找一些最佳实践。假设我有一个这样的网址/Post/Edit?Id=25
我确保用户有权在 Get 请求上按 Id 编辑特定帖子,并且对于我在 Controller 中的帖子也是如此。我正在使用 ValidateAntiForgeryToken。
问题:我应该在我的 EditModel 中包含 Id 属性吗?如果是这样,我应该加密它吗?
问题是我可以使用 FireBug 编辑 Id hiddedinput 并编辑不同的帖子,只要我有权这样做。这并不可怕,但似乎是错误的。
任何帮助都会很棒!
最佳答案
有几种方法可以防止这种情况。
第一个 - 根本不向客户端发送敏感数据。将帖子 ID 保存在 session 变量中,以便用户永远无法编辑它。这可能是也可能不是一个选项,具体取决于您的架构。
下一种方法是将直接引用转换为间接引用。例如,您应该发送一个不透明的列表 {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
的隐藏字段。 .
当发出下一个请求时,重做整个过程。如果哈希值不同,则停止该过程。
安全方面,我按降序列出了选项。同时,它的便利性可能会越来越高。您必须为您的应用选择正确的组合。
关于ASP.NET MVC 2 EditModel 包含 Id?保护 ID 未被篡改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648452/