0

这可能有点模糊,但我希望在 SO 上的所有人中,会有一些人以前遇到过这类问题。

背景
我们的应用程序是一个控制火车订单的 C#/.NET 服务。我们使用 LINQ-to-SQL 将铁路网络的状态和火车订单存储在 SQL Server 2005 数据库中。
我们有一个安全要求,即 COTS 软件本身不能被“信任”。

要求
因此,风险被捕获为:“SQL 服务器或操作系统修改静态或动态数据”。
我们的任务:“存储在数据库中的数据应经过验证,以便在读取时可以通过数据访问代码确认自上次提交以来它没有更改。”

问题
我很想找到一种“自动”的方式来满足这个要求。
如果做不到这一点,则无需在数据库的每个表中创建列来存储计算的哈希值(然后我们必须在读取时对其进行验证)来满足条件。

4

2 回答 2

1

可能类似于 MD5 校验和,它保存在与主数据相同或不同的表中。校验和将由您的 C# 应用程序生成,因此如果有人使用原始 SQL 进行更新,校验和将关闭。

于 2010-11-16T08:20:45.567 回答
1

在读取时,可以通过数据访问代码确认它自上次提交以来没有更改。

那是微不足道的。在除快照之外的所有非脏读隔离级别下,读取的数据都是最后提交的数据。根据定义,自上次提交以来它没有更改(换句话说,如果它已更改,则新值上次提交)。意外更改(因为要求提到“操作系统修改数据”)称为“数据损坏”,并由页面校验和TDE捕获。

也许真正的要求是自从读入应用程序以来数据库中的值没有改变?然后是 Optmistic Concurency Control,仅此而已。只需将每个“旧”值添加到您的 UPDATE WHERE 子句中,它就会自行处理。如果您没有更新任何行(您将通过检查@@ROWCOUNT 或使用 OUTPUT 子句知道这一点),那么您知道该行已更改。也可以部署主动缓存。

于 2010-11-16T09:11:37.887 回答