2013-08-25 48 views
0

隐藏域篡改保护:Id,RowVersion,我使用亚当Tuloman AntiModelInjection版本。解决方案:选择输入,防止下拉篡改

我目前正在调查一种方法来防止篡改在选择列表/下拉菜单中找到的有效选项。考虑一个多租户共享数据库解决方案,其中fk不够安全,并且选项在级联下拉列表中被动态过滤。

在ASP.NET webforms的旧时代,有一种viewstate可以免费添加防篡改功能。如何在阿贾克斯时代完成选择列表篡改防范?通过比较散列而不是重新从数据库中获取选项值并手动比较,是否有一个通用的解决方案?

Is ViewState relevant in ASP.NET MVC?

回答

0

勒布朗,以我的经验,客户端验证已大多用于用户提供方便。不必POST,只有然后发现有什么不对。

最终验证需要发生在服务器端,远离操纵HTML的能力。普通用户不会忍受选择列表和下拉菜单的磨练。这是由试图破坏你的页面或非法访问数据的人完成的。我想我的观点是最终安全需要存在于服务器中,而不是客户端。

0

我认为在给出一些假设的情况下可以创建一个全局解决方案。在我建立任何东西之前,我想提出一个开放的解决方案,以查看是否有人可以发现缺陷或潜在的问题。

鉴于所有下拉列表都远程检索其数据。 - 在ajax时代和级联盒现在更常见。 (我们使用的剑道下拉列表。)

public SelectList GetLocations(int dependantarg); 

选择列表的将被返回的JSON - 但没有newtonsoft序列化器自动注入之前(在全球范围内完成)

  1. EncryptedAndSigned属性设置JSON。该属性将包含完整SelectList的序列化版本,其中包含所有也被加密的有效值。
  2. EncryptedName属性给json。此属性将有控制器actionname - 在这个例子中EncryptedName值将是“的getLocations”

当HTTP POST由EncryptedName:EncryptedAndSigned必须在后也可以发送。对于这个JSON POST例子那就是:

{ 
Location_Id: 4, 
GetLocations: 'EncryptedAndSigned value' 
} 

在服务器端:

[ValidateOptionInjection("GetLocations","Location_Id") 
public ActionResult Update(Case case) 
{ 
    //access case.Location_Id safety knowing that this was a valid option available to the user. 
} 
1

如果可以的话,这里的单一解决方案是由当前用户ID的权限来过滤该数据,并那么这些权限会在保存时再次验证。

如果这是不可能的(并且服务器端通过诸如记录中的CustomerId fk之类的东西来完成此操作有多种方式,要添加到服务器端的临时安全缓存等),则客户端价值可以提供额外的选择。

如果客户端选项与Web窗体一样提供,请考虑根据其 a进行加密。)用户ID和另一键 湾)的SessionID(必须建立会话时间提前虽然或者直到会话是由存储在所述会话的值来建立会话ID可以为每个请求改变对象。 ℃。)一些其它不同值

HTTPS是极其重要这里,所以这些值不闻。此外,理想情况下,您希望每页都具有唯一性。这可能是上面A中的第二个关键。为什么?我们不希望攻击者想出一个办法,在你的web应用创建别处新记录,并能够找出哈希值或加密值是1,2,3,4,5,6等,并创建本质上是一个价值假彩虹表。

+0

所以,如果ValidateOptionInjection加密密钥列入ActionName,USER_ID,TenantDataGroup_Id,程序集的版本,部署盐?单独使用密钥会使每个下拉式加密都以每个用户为基础单独使用。这种广义解决方案的好处是可以用相对小的努力来保护应用程序。额外的服务器验证器可以始终添加,但从一开始,这将保护大多数下拉列表并阻止更多的个人篡改表单。 –

+0

会,不过,请注意,如果你重构与上述任何数据的改变你的数据会失败。因此,如果用户正在编辑一个页面,而你部署一个新的版本,后返回到服务器,然后将失败。我不确定你的应用程序是否允许这样的事情,但要牢记这一点。 Web表单跟踪所有值,当您想通过客户端脚本动态地将值添加到下拉列表中时,它变得困难。 –