【问题标题】:ASP.NET MVC 2 EditModel include Id? Securing Id is not tampered withASP.NET MVC 2 EditModel 包含 Id?保护 ID 未被篡改
【发布时间】:2010-09-06 12:32:10
【问题描述】:

在 ASP.NET MVC 应用程序中创建 EditMoels 和更新数据时,我正在寻找一些最佳实践。假设我有一个这样的网址 /Post/Edit?Id=25

我确保用户有权在 Get 请求中按 Id 编辑特定帖子,并且对于我在控制器中的帖子也是如此。我正在使用 ValidateAntiForgeryToken。

问题:我应该在我的 EditModel 中包含 Id 属性吗?如果是这样,我应该加密它吗?

问题是我可以使用 FireBug 编辑 Id hiddedinput 并编辑不同的帖子,只要我有权限这样做。这并不可怕,但似乎是错误的。

任何帮助都会很棒!

【问题讨论】:

    标签: asp.net security asp.net-mvc-2


    【解决方案1】:

    有几种方法可以防止这种情况发生。

    第一个 - 根本不向客户端发送敏感数据。将帖子 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 的隐藏字段。

    当下一个请求发出时,重做整个过程。如果哈希值不同,则停止该过程。

    安全方面,我按降序列出了选项。同时,它的便利性可能会越来越高。您必须为您的应用选择正确的组合。

    【讨论】:

      【解决方案2】:

      我认为你不必担心,如果用户按照你说的做,我想你会知道谁编辑了什么,所以如果他编辑了错误的帖子,按照你说的做,你总是可以删除他的版本权...

      如果您无法吸引用户,请不要让他们编辑任何内容...

      【讨论】:

      • 这不是我“不能”,而是更多我不应该。我不认为这个网站只是信任每个用户,但仍然允许每个人编辑他们的帖子和 cmets。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多