隐藏字段篡改保护:Id,RowVersion,我使用的是Adam Tuliper AntiModelInjection版本。
我正在研究一种防止篡改选择列表/下拉列表中的有效选项的方法。考虑一个多租户共享数据库解决方案,其中fk不够安全,并且选项在级联下拉列表中进行动态过滤。
在ASP.NET webforms的旧时代,有一个viewstate免费增加了篡改预防。如何在ajax时代完成选择列表篡改预防?通过比较哈希而不是从数据库中重新获取选项值并手动比较,是否有通用的解决方案?
答案 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序列化转换器自动注入之前不会:(在全局级别完成)
当发布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.
}