ASP.NET MVC 2 EditModel 包含 Id?保护 ID 未被篡改

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

在 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/

相关文章:

c# - 更改 Umbraco CMS 主题/样式(免费)

powershell - 从 VSTS 版本访问 Azure 服务主体详细信息

javascript - 如果直接定位,则限制对文件的访问

php - 内容数据库 - 可以存储 HTML 吗?

asp.net-mvc - 资源类型 'XXXX.XXX' 没有名为 '_RequiredXXXX' 的公开可见静态属性

asp.net - 从内容页更新母版页图像

asp.net - 使用 Windows 身份验证注销 ASP.NET MVC 应用程序并能够使用同一用户再次登录

c# - ASP.NET - 单元测试 MembershipProvider

asp.net-mvc-2 - 将模型数据传递给外部 javascript

asp.net-mvc - ASP.NET EditorTemplate下拉列表