0

对于隐藏字段篡改保护:Id,RowVersion,我使用了 Adam Tuliper AntiModelInjection 的一个版本。

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

在过去的 ASP.NET webforms 中,有一种 viewstate 可以免费添加防篡改功能。ajax时代如何防止选择列表篡改?通过比较哈希而不是从数据库中重新获取选项值并手动比较是否有通用解决方案?

ViewState 在 ASP.NET MVC 中是否相关?

4

3 回答 3

1

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

如果这是不可能的(并且服务器端有多种方法可以通过记录中的 CustomerId fk 来完成此操作,添加到服务器端的临时安全缓存等),那么客户端值可以提供附加选项。

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

HTTPS在这里非常重要,因此不会嗅探这些值。此外,理想情况下,您希望使它们每页都独一无二。这可能是上面 A 中的第二个键。为什么?我们不希望攻击者想办法在您的 Web 应用程序的其他地方创建新记录,并能够找出 1、2、3、4、5、6 等的哈希值或加密值并创建本质上是一个可以伪造的彩虹表。

于 2013-08-26T16:43:48.653 回答
0

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

鉴于所有下拉菜单都可以远程检索其数据。- 在 ajax 时代和级联框,这现在更常见了。(我们正在使用剑道下拉菜单。)

public SelectList GetLocations(int dependantarg);

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

  1. json 的 EncryptedAndSigned 属性。此属性将包含完整 SelectList 的序列化版本,其中包含所有有效值,这些值也已加密。
  2. json 的 EncryptedName 属性。此属性将具有控制器操作名称 - 对于此示例,EncryptedName 值将是“GetLocations”

当发布 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.
 }
于 2013-08-26T03:21:47.907 回答
0

Leblanc,根据我的经验,客户端验证主要用于方便用户。不必发布,然后才发现有问题。

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

于 2013-08-26T00:13:07.093 回答