解决方案:选择输入,下拉防篡改

时间:2013-08-25 23:31:33

标签: security asp.net-mvc-4 tampering

隐藏字段篡改保护:Id,RowVersion,我使用的是Adam Tuliper AntiModelInjection版本。

我正在研究一种防止篡改选择列表/下拉列表中的有效选项的方法。考虑一个多租户共享数据库解决方案,其中fk不够安全,并且选项在级联下拉列表中进行动态过滤。

在ASP.NET webforms的旧时代,有一个viewstate免费增加了篡改预防。如何在ajax时代完成选择列表篡改预防?通过比较哈希而不是从数据库中重新获取选项值并手动比较,是否有通用的解决方案?

Is ViewState relevant in ASP.NET MVC?

3 个答案:

答案 0 :(得分:1)

如果可以,此处的单个解决方案是按当前用户ID对该数据的权限进行过滤,然后在保存时再次验证这些权限。

如果这是不可能的(服务器端有多种方式通过记录中的CustomerId fk,添加到服务器端的临时安全缓存等)来实现此目的,那么客户端值可以提供额外的选择。

如果像Web窗体那样提供客户端选项,则考虑根据它们进行加密 a。)用户ID加上另一个密钥 b。)SessionId(会话必须提前建立,或者会话ID可以按请求更改,直到会话由存储在会话对象中的值建立。 c。)其他一些不同的值

HTTPS 非常非常重要,所以这些值不会被嗅探。另外,理想情况下,您希望每页都使它们具有唯一性。这可能是上面A中的第二个关键。为什么?我们不希望攻击者找到在Web应用程序的其他位置创建新记录的方法,并能够找出1,2,3,4,5,6等的哈希值或加密值,并创建本质上是一个虚假的彩虹表。

答案 1 :(得分:0)

Leblanc,根据我的经验,客户端验证主要用于方便用户。没有POST,只有在发现问题时才会发现。

最终验证需要在服务器端进行,远离操作HTML的能力。普通用户不会继续使用选择列表和下拉菜单。这是由试图破坏您的页面或非法访问数据的人完成的。我想我的观点是服务器中存在最终安全性需求,而不是客户端。

答案 2 :(得分:0)

我认为可以通过一些假设来创建全局解决方案。在我构建任何东西之前,我想提出一个开放的解决方案,看看是否有人能找到缺陷或潜在的问题。

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

public SelectList GetLocations(int dependantarg);

SelectList将以json的形式返回 - 但是在newtonsoft序列化转换器自动注入之前不会:(在全局级别完成)

  1. 到json的EncryptedAndSigned属性。此属性将包含完整SelectList的序列化版本,其中包含同样已加密的所有有效值。
  2. 加密名称属性为json。此属性将具有控制器actionname - 对于此示例,EncryptedName值将为“GetLocations”
  3. 当发布http帖子时,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.
     }