2013-09-05 57 views
1

我有一个数据库表,我想阻止用户修改值/行。我怎样才能做到这一点?如何防止用户更改数据库表中的值/行?

这里有一些标准:

  1. 要保护的表具有与存储在纯文本数据的单个列。
  2. 如果需要帮助保护单列,可以将其他列添加到表中。
  3. 我的应用程序需要能够添加,编辑和删除表中的值/行。
  4. 对于这个问题,我假设用户具有对数据库的完全和直接的管理/读/写访问权限,即用户可以直接登录数据库执行查询。
  5. 如果用户直接在数据库中更改值,我的应用程序需要在检查表时发出这种情况。
  6. 数据库中还有其他表格,但它们不需要以这种方式保护。如果需要,可以使用它们来帮助保护第一张桌子。
  7. 数据库引擎不可知的解决方案会很好,但我使用SQL Server 2005或更高版本。

例如:

比方说,我的表有3行数据 “A”, “B”, “C”。我的应用程序应该能够将值更改为“A”,“B”,“D”,但不是我的用户(通过直接修改数据库)。此外,我预计如果我的应用程序将值更改为“A”,“B”,“D”,则用户无法直接编辑表格以返回到“A”,“B”,“C”。如果发生这种情况,应用程序将标记该表已被篡改。

+0

这可以全部在应用程序内部进行控制,所以除非你给你的用户直接访问数据库,否则你应该没有问题。如果你的用户有直接的数据库访问权限,你可以调整用户拥有的权限。有些RDBMS在列级支持权限以及审计,所以如果做出任何更改,您将会知道。不知道你正在使用哪个RDBMS,问题的这一部分很难回答。 – NullUserException

+0

数据库引擎不可知的解决方案会很好,但我使用SQL Server 2005或更高版本。我假设用户有直接的数据库访问权限,可以修改数据库中的任何内容。 – sparks

+0

您是否在意用户是否间接修改数据库,例如通过编写自己的应用程序或使用Access,Excel,...?您只想防止使用SSMS所做的更改? – HABO

回答

0

所有我能想到的这里,将是某种形式的MAC或签名模式

在要保护的列中的数据导出散列,加上一个秘密值,以获得消息认证码,并存储在另一列...

您的应用程序可以计算出MAC再次当你要测试的完整性......

问题:秘密需要保存在某个地方......

你也可以设置s作为数字签名模式,其中应用程序只保存验证密钥,而某处的服务将为您的应用程序添加时间戳和签名数据......这样,您只需将该服务的密钥保存为真正的秘密。 ..

+0

我们想到了散列解决方案,但问题是用户可以在我的示例中描述的场景中篡改这一点。即(1)值A,B,C和散列(A,B,C)存储在DB(2)中用户使用应用程序来更改值,现在我们有值A,B,D和散列(A ,B,D)用户直接修改数据库,用C代替D,用散列(A,B,C)散列(A,B,D),他从步骤1获得散列(A,B,C)。 – sparks

+0

,您至少需要一个没有公共访问权限的数据库来将原始数据库中的每个记录的时间戳或一个随机数存储起来...... – DarkSquirrel42

相关问题