0

我有一个跟踪属性更改的类

public class Property
        {
            object _OriginalValue;
            object _ProposedValue;
            DateTime _ProposedDateTime;
            List<Property> _History = new List<Property>();
            public object OriginalValue
            {
                get
                {
                    return _OriginalValue;
                }

                set
                {
                    _OriginalValue = value;
                }
            }
            public object ProposedValue
            {
                get
                {
                    return _ProposedValue;
                }

                set
                {
                    _ProposedDateTime = DateTime.Now;
                    _ProposedValue = value;
                }
            }
            public bool IsDirty
            {
                get
                {

                    if (OriginalValue != ProposedValue)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

这个属性可以被类使用,比如

 public class Customer
        {
            protected Property _FirstName = new Property();
            public string FirstName
            {
                get
                {
                    return (string)_FirstName.ProposedValue;
                }

                set
                {
                    _FirstName.ProposedValue = value;
                }
            }

            public object GetOriginalValue(Property Property)
            {
                return Property.OriginalValue;
            }

        }

问题是,在将其传递给 N 层架构中的客户端时,是否有办法保护原始值?

当客户端将客户传递回服务边界时 - 默认情况下您不能信任客户端。您需要从数据库重新加载原始值或验证原始值是否未被篡改。当然,我假设我们将使用基于客户当前值的业务逻辑来拒绝或允许更新操作。

例子:

用户插入名称为 Bob 的记录。

用户获取名称为 Bob 的记录并将名称更改为 Ted。原始值是 Bob,建议值是 Ted。

用户将客户发送到服务以更新客户。

万事皆安。

*现在将业务规则编码到服务中,说明如果客户的名字是 Ted - 允许更新,否则抛出“无法更新”异常。*

用户获取名为 Ted 的记录。用户将名称更改为 Darren。用户将名称改回 Ted - 系统抛出异常。用户获取 Ted。用户作弊并使用工具更改客户端上的 OriginalPropertyValue。服务器不会从数据库中重新获取 OriginalValue,而只是读取来自客户端的 OriginalValue。

用户绕过业务规则。

4

1 回答 1

2

实际上,您的方法存在更多问题,而不仅仅是检查原始值是否未被篡改。例如,我怀疑这是一个多用户环境,其中不止一个用户能够编辑同一个对象。也就是说,原始值可能不会被篡改,而是在其他人已经在数据库中保存了新的原始值之前进行了更改。

我猜你已经对你的数据应用了某种乐观或悲观的锁定......

关于您的实际问题,您可能需要对原始值进行签名,并且每当您要将这些对象存储回数据库时,您的应用程序层应检查原始值是否未被篡改(来自维基百科):

数字签名是大多数加密协议套件的标准元素,通常用于软件分发、金融交易、合同管理软件以及其他需要检测伪造或篡改的情况。

于 2017-02-08T10:31:36.027 回答