Security/Validation 在 c# 属性 上更改 N 层
Security/Validation on c# property change N-Tier
我有一个 class 可以跟踪 属性 变化
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;
}
}
}
}
这个属性可以被class之类的
使用
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 - 允许更新,否则抛出 "unable to update" 异常。 *
用户获取名为 Ted 的记录。
用户将名称更改为 Darren。
用户将名称改回 Ted - 系统抛出异常。
用户获取 Ted。用户作弊并使用工具更改客户端上的 Original属性Value。
服务器不会从数据库中重新获取 OriginalValue,而只是读取来自客户端的 OriginalValue。
用户绕过了业务规则。
实际上,您的方法存在更多问题,而不仅仅是检查 原始值 是否未被篡改。例如,我怀疑这是一个 multi-user 环境,其中不止一个用户能够编辑同一对象。也就是说,原始值可能不会被篡改,但在其他人已经保存新的原始值数据库.
我猜您已经对数据应用了某种乐观或悲观锁定...
关于您的实际问题,您可能需要 sign 您的 原始值 ,并且无论何时您要将这些对象存储回数据库,您的应用程序图层应检查原始值是否未被篡改(来自维基百科):
Digital signatures are a standard element of most cryptographic
protocol suites, and are commonly used for software distribution,
financial transactions, contract management software, and in other
cases where it is important to detect forgery or tampering.
我有一个 class 可以跟踪 属性 变化
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;
}
}
}
}
这个属性可以被class之类的
使用 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 - 允许更新,否则抛出 "unable to update" 异常。 *
用户获取名为 Ted 的记录。 用户将名称更改为 Darren。 用户将名称改回 Ted - 系统抛出异常。 用户获取 Ted。用户作弊并使用工具更改客户端上的 Original属性Value。 服务器不会从数据库中重新获取 OriginalValue,而只是读取来自客户端的 OriginalValue。
用户绕过了业务规则。
实际上,您的方法存在更多问题,而不仅仅是检查 原始值 是否未被篡改。例如,我怀疑这是一个 multi-user 环境,其中不止一个用户能够编辑同一对象。也就是说,原始值可能不会被篡改,但在其他人已经保存新的原始值数据库.
我猜您已经对数据应用了某种乐观或悲观锁定...
关于您的实际问题,您可能需要 sign 您的 原始值 ,并且无论何时您要将这些对象存储回数据库,您的应用程序图层应检查原始值是否未被篡改(来自维基百科):
Digital signatures are a standard element of most cryptographic protocol suites, and are commonly used for software distribution, financial transactions, contract management software, and in other cases where it is important to detect forgery or tampering.