【问题标题】:Integrity of Hidden Fields: Asp.NET mvc隐藏字段的完整性:Asp.NET mvc
【发布时间】:2011-03-20 19:13:58
【问题描述】:

我们一直在使用 asp.net mvc 进行开发。有时,我们需要在表单上放置一些隐藏字段,这些字段由 modelbinder 推送到模型中(如预期的那样)。如今,用户可以使用 firebug 或其他实用程序轻松调整表单。隐藏字段的目的主要是按原样向服务器提供一些信息,并且它们不会被更改。

例如,在我的编辑员工表单中,我可以将 EmployeeID 放在隐藏字段中,但如果用户更改隐藏字段中的员工 ID,则会在数据库中更新错误的员工。在这种情况下,我们如何保持隐藏字段的完整性。

【问题讨论】:

  • 可以在更新模型之前进行服务器端验证。确保登录的用户有权更新指定的员工。

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3 hidden-field


【解决方案1】:

您需要实施安全措施以确保进行修改的人有权这样做。我通常会将 id 放在 URL 中而不是隐藏字段中,依靠安全性来确保人们不会修改他们不应该修改的东西。如果他们在手动更改 id 时确实有权修改项目,那应该不是问题。重要的是要确保一个人不能手动更改 id 并访问他们不应该访问的东西。强制服务器端权限解决了这个问题。您可以将 Roles 与 AuthorizeAttribute 结合使用,轻松做到这一点。

【讨论】:

  • 是的,检查是为了确保每个人都可以访问或修改属于他的记录,但我仍然不希望用户手动更改 ID 并破坏他在数据库中的一条记录。
【解决方案2】:

如果用户在 隐藏字段,错误的员工将是 在数据库中更新

这是您网站中的一个主要安全漏洞。在您对 Web 开发所做的所有事情中,无论某人的代码多么聪明,或者您认为只要用户不做某事就可以了,请记住一条黄金法则:永远不要隐含地信任从客户。

要修改您网站中的任何内容,用户必须登录。(对吗?)因此,在用户尝试向网站发布表单(尤其是可以修改数据的表单)时,请仔细检查提交表单的用户有权对指定的数据执行请求的操作。

理想情况下,每个不完全公开和不安全的操作都应该进行服务器端权限检查。永远不要相信客户发给你的东西。

【讨论】:

    【解决方案3】:

    一种可能的替代方法是将静态的一次性信息存储在服务器上的 TempData 中,而不是将其传递给可能被篡改的客户端。请记住,默认情况下 TempData 使用 Session 并且有其自身的限制 - 但它可能是一个选项。

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多