【问题标题】:Determine which entity properties have been modified in BeforeEntitySave确定在 BeforeEntitySave 中修改了哪些实体属性
【发布时间】:2013-11-28 23:17:33
【问题描述】:

使用自定义的 EFContextProvider,我想在保存之前检查实体上哪些属性已被修改,以便我可以实现:

  • 安全性:客户端有权仅更改实体的某些属性。
  • 审核:无论何时更改某些属性,都需要记录更改。

有关于 SO 使用 OriginalValuesMap 来确定修改后的属性的建议,请参阅herehere。如果原始值与新值不同,则该属性已被修改。但是,这些原始值是由客户端提供的,因此可以伪造以匹配新值,绕过此检查。

我链接的第一个 SO 问题表明这不是问题,因为如果以这种方式伪造原始值,则无论如何都不会保存这些属性:

对于我们没有以任何方式使用的任何其他“未更改”属性,我们不必担心它是否被篡改,因为即使被篡改,被篡改的值也不会被持久化到数据库中

然而,这是不正确的,只要实体上的所有修改属性的原始值都是伪造的。例如,以下代码将绕过基于 OriginalValuesMap 的服务器端安全检查,仍然保存到数据库中:

manager.fetchEntityByKey('Employee', 42).then(function (result) {
    var employee = result.entity;
    employee.Salary(1000000); // do you think HR will notice?
    delete employee.entityAspect.originalValues.Salary;
    return manager.saveChanges();
});

当 Breeze .NET 接收到实体时,它会将实体添加到处于已修改状态的实体框架上下文中,并且没有标记为已修改的属性,实体框架的行为是保存所有提供的属性值到数据库。

IMO 这是 EFContextProvider.HandleModified 中的一个安全漏洞,它将 EF 实体状态覆盖为已修改(该方法中甚至有一条注释警告不要这样做)。无论如何,确定哪些属性已更改并即将保存的正确方法是什么?

【问题讨论】:

    标签: breeze


    【解决方案1】:

    在您的上下文中拦截保存并检查它是否合法保存。为了解释起见,假设您要保存 RestrictedClass 类型的实体,并且您定义了表 RestrictedClasses 来模仿数据库中的表。

        public override int SaveChanges()
        {
            foreach (
                var entry in
                    this.ChangeTracker.Entries()
                        .Where((e => (e.State == (EntityState) Breeze.WebApi.EntityState.Modified))))
            {
                if (entry.Entity.GetType() == typeof(RestrictedClass))
                {
                    var entity = entry.Entity as RestrictedClass;
                    var originalEntities = RestrictedClasses.Where(e => e.Id = entity.Id).toList();
                    if (originalEntities.Count == 0) continue; // user is trying to add, illegal since it says it's modified, you do different check for EntityState.Added
                    var originalEntity = originalEntities[0]; // there should be only one, unique ID
                    //.... now you check differences between entity and originalEntity and decide whether it's legal or not based on user role.
    

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2018-04-30
      • 1970-01-01
      相关资源
      最近更新 更多