2012-04-23 48 views
0

我有一个问题困扰了我很长一段时间。也就是说,我正在为某个组织开发一个网站,公民和其他法律实体将会有大量的数据输入。对于这个问题,我希望尽可能从用户条目和某种故障或恶意使用中获得应用程序。在POST上重复数据验证

这个想法如下。我有一个实体,我们称之为EntityA,它是EntityB的父亲。两个实体都将唯一标识符(GUID)作为数据库中的数据类型(主键)。 EntityB拥有EntityA的外键。当执行创建行动的一个HTTP GET版本以下规则进行检查,并且所有三个必须在线北京:

  1. ID传给行动必须不等于Guid.Empty(此ID是EntityA.Id值)
  2. 实体A必须存在(EntityA.Id == ID)
  3. 实体B不能存在(EntityA和EntityB只能有一对一的关系)。

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

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

编辑:这将是很好,以避免再次访问数据库。

回答

2

您必须再次检查是否存在EntityA(并且据我了解,不存在EntityB)。

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

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

注意:从你的问题,我认为你的GUID是“秘密”。即其他用户看不到它们。如果情况并非如此,我相信你应该添加一个额外的检查来验证通过的ID确实属于已认证的用户。

+0

Ofer,谢谢你的回复。昨天晚上我发现,因为在数据库级别建立了关系,所以不需要检查EntityA是否存在,因为EntityB不会成功添加。但是,除了在POST中重复检查外,没有别的办法。 – 2012-04-24 07:28:27