假设我在用户之间有公共和私人消息的消息服务。我希望每个人都可以看到“公共”的,而“私人的”则非常私密。哪两个设计都是最好的?
A)
拥有一个名为“messages”的数据库,其中包含
列或 b)
有两个数据库,一个名为“messages_public”,另一个名为“messages_private”,后面有相同的列
我知道第二种方法是多余的,但更安全的是,在发生错误的情况下,不会意外地为每个人显示私人消息(这将是灾难 ), 我对吗? 另一方面,在第一种情况下,它确实可以。 SQL查询中的一个简单错误可能无法过滤私有消息,它会显示每个消息。
答案 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)
我认为第二个将是使用的地狱,它上面的应用程序将更容易出现第一个错误。 顺便说一下,应该在应用程序级别管理安全性,即服务器和用户应用程序本身的配置。 祝你好运!