很简单的数据库设计问题

时间:2011-07-20 02:25:12

标签: mysql sql database security database-design

假设我在用户之间有公共和私人消息的消息服务。我希望每个人都可以看到“公共”的,而“私人的”则非常私密。哪两个设计都是最好的?

A)

拥有一个名为“messages”的数据库,其中包含

  • ID
  • 发送方
  • 接收器
  • 时间戳
  • 隐私(这是一个布尔值,0表示私人,1表示公开)

b)

有两个数据库,一个名为“messages_public”,另一个名为“messages_private”,后面有相同的列

  • ID
  • 发送方
  • 接收器
  • 时间戳

我知道第二种方法是多余的,但更安全的是,在发生错误的情况下,不会意外地为每个人显示私人消息(这将是灾难 ), 我对吗? 另一方面,在第一种情况下,它确实可以。 SQL查询中的一个简单错误可能无法过滤私有消息,它会显示每个消息。

6 个答案:

答案 0 :(得分:3)

我认为任何一种设计都可以,但我更喜欢第一种,因为它消除了冗余。

在您的情况下,安全性将归结为您的应用程序代码,这将必须保证私人消息仅传递给适当的用户。如果应用程序代码中存在缺陷,则任一数据库模式都可能将私有数据暴露给错误的用户。

答案 1 :(得分:3)

您可能希望考虑使用一个表的一个数据库,但使用数据库视图来显示公共消息,例如:

CREATE VIEW public_messages AS SELECT * FROM messages WHERE private = false;

然后从public_messages视图中选择您的公共消息。这可以帮助防止在代码中的select语句中省略private = false的笨拙的编程错误。

答案 2 :(得分:1)

最好将所有内容保存在一个表中。在任何情况下,拆分表可能都没有你认为它可以做的优点。

  • 如果攻击者找到了转储整个公共表的方法,那么 他们可能也可以将messages_private转储出来。

  • messages_private不仅包含我自己的私信,还包含 每个人都是,所以如果这个假设错误发生在我看的时候 在我自己的私人信息中,无论如何它最终会倾倒所有人。

答案 3 :(得分:1)

如果他们必须“非常私密”。而不是"有点私人"或"私人"然后使用单表方法,加密私人消息,并在出路时解密它们。那样的话,如果你松了一口气,那么最糟糕的情况就是显示出胡言乱语。

但最终,我只是说唐没有犯任何错误。

答案 4 :(得分:0)

两者都可能失败,这取决于你的错误!这就是你先测试的原因。如果您对表名感到困惑,第二种方法可能会像第一种方法一样容易失败,因为结构是相同的。

答案 5 :(得分:0)

我认为第二个将是使用的地狱,它上面的应用程序将更容易出现第一个错误。 顺便说一下,应该在应用程序级别管理安全性,即服务器和用户应用程序本身的配置。 祝你好运!