0

我有一个困扰我很长一段时间的问题。也就是说,我正在为某个组织开发一个网站,公民和其他法人实体将输入大量数据。就此而言,我想尽可能地保护应用程序免受用户条目和某种故障或恶意使用的影响。

思路如下。我有一个实体,我们称它为 EntityA,它是 EntityB 的父级。两个实体都将唯一标识符 (GUID) 作为其在数据库中的数据类型(主键)。EntityB 有一个指向 EntityA 的外键。当执行 Create 操作的 HTTP GET 版本时,会检查以下规则并且必须满足所有三个规则:

  1. 传递给操作的 ID 不得等于 Guid.Empty(此 ID 是 EntityA.Id 中的值)
  2. EntityA 必须存在(EntityA.Id == ID)
  3. EntityB 不能存在(EntityA 和 EntityB 只能是一对一的关系)。

当向用户显示数据输入屏幕时,这一切都很好。我的问题是,我应该在 POST 上再次执行检查吗?如果我有一个恶意用户,他/她可以使用 Fiddler 作为代理,并在让数据通过应用程序之前更改数据。因此,可以在 POST 上规避上述规则。有没有人对上述情况有一个好的策略?我应该再次重新检查这些值(再次返回数据库以执行相同的检查)还是应该尝试存储,例如 TempData 中的 ID 并在 POST 上再次访问它以将该 ID 与传递给操作的 ID 进行比较,或者添加到EntityB模型?有一个更好的方法吗?

因此,目标是避免重复代码并创建安全代码。

编辑:最好避免再次访问数据库。

4

1 回答 1

2

您必须EntityA再次检查是否存在(据我所知,不存在 an EntityB)。

至于代码重复:检查可以很容易地重构为一个统一的方法。

至于性能:首先,您必须意识到安全性是最高优先级,如果它涉及对数据库的额外打击 - 就这样吧。话虽如此,肯定有一些好的解决方案可以避免这种打击。例如,将 ID(您在第一阶段发现的合法)保存在Cache对象中。

注意:根据您的问题,我认为您的 GUID 是“秘密”的。即其他用户看不到他们。如果不是这种情况,我认为您应该添加一个额外的检查,以验证传递的 ID 确实“属于”经过身份验证的用户。

于 2012-04-23T21:38:55.340 回答