我们一直在使用 asp.net mvc 进行开发。有时,我们需要在表单上放置一些隐藏字段,这些字段由 modelbinder 推送到模型中(如预期的那样)。如今,用户可以使用 firebug 或其他实用程序轻松调整表单。隐藏字段的目的主要是按原样向服务器提供一些信息,它们并不意味着改变。
例如,在我的编辑员工表单中,我可以将 EmployeeID 放在隐藏字段中,但如果用户更改隐藏字段中的员工 ID,则会在数据库中更新错误的员工。在这种情况下,我们如何保持隐藏字段的完整性。
我们一直在使用 asp.net mvc 进行开发。有时,我们需要在表单上放置一些隐藏字段,这些字段由 modelbinder 推送到模型中(如预期的那样)。如今,用户可以使用 firebug 或其他实用程序轻松调整表单。隐藏字段的目的主要是按原样向服务器提供一些信息,它们并不意味着改变。
例如,在我的编辑员工表单中,我可以将 EmployeeID 放在隐藏字段中,但如果用户更改隐藏字段中的员工 ID,则会在数据库中更新错误的员工。在这种情况下,我们如何保持隐藏字段的完整性。
您需要强制执行安全性以确保进行修改的人有权这样做。我通常还将 id 放在 URL 中而不是隐藏字段中,依靠安全性来确保人们不会修改他们不应该修改的东西。如果他们在手动更改 id 时确实有权修改项目,那应该不是问题。重要的是要确保一个人不能手动更改 id 并访问他们不应该访问的东西。强制服务器端权限解决了这个问题。您可以使用 Roles 和 AuthorizeAttribute 轻松完成此操作。
如果用户更改隐藏字段中的employeeID,则会在数据库中更新错误的员工
这是您网站中的一个主要安全漏洞。在您对 Web 开发所做的每一件事中,无论某人的代码多么聪明,或者您认为只要用户不做某事就可以了,请记住一条黄金法则:永远不要隐含地信任从客户端接收到的数据。
为了修改您网站中的任何内容,用户必须登录。(对吗?)因此,在用户尝试向网站发布表单(尤其是可以修改数据的表单)时,请仔细检查用户是否提交表单有权对指定的数据执行请求的操作。
理想情况下,每个不完全公开和不安全的操作都应该进行服务器端权限检查。永远不要相信客户发给你的东西。
一种可能的替代方法是将静态的、一次性使用的信息存储在服务器上的 TempData 中,而不是将其传递给可能被篡改的客户端。请记住,默认情况下 TempData 使用 Session 并且有其自身的限制 - 但它可能是一个选项。