首页 > 解决方案 > 为每个用户创建 SQL 表作为安全措施

问题描述

我已经研究过这个主题,并且在大多数实践中我相对确定答案是“否”,但我想针对我的案例提出一些第二意见。

我们目前正在开发一个多用户网络应用程序,每个用户基本上在网络应用程序中都有自己的副本“门户/应用程序”。我担心的不是性能,而是安全性。

我正在考虑使用前缀 userid_table1、userid_table2 对数据进行分区,以使其更易于管理,并确保开发团队不会进行安全验证监督,因为我们可以轻松添加验证以确保只能针对具有 userid_ 的表运行查询*。

你还会反对这种方法吗?

标签: sqlsql-server

解决方案


我正在考虑使用前缀 userid_table1、userid_table2 对数据进行分区,以使其更易于管理,并确保开发团队不会对安全验证进行监督,因为我们可以轻松添加验证以确保只能针对具有 userid_ 的表运行查询*。

更易于管理?这听起来像个笑话。您的数据库最终将拥有无数不同的表。 您想要对所有用户执行的任何操作都将是一场噩梦:

  • 声明外键约束。
  • 在表上定义新索引。
  • 添加新列。
  • 重组表。
  • 等等。等等。

您的用户可能仅限于一个表。但是应用程序开发人员和 DBA 需要处理所有这些问题。想到试图找出这样一个系统中的性能瓶颈在哪里,我感到畏缩。

我应该补充一点,数据库针对表而不是很多表进行了优化,因此多个表通常效率较低。当您考虑所有这些表中的所有半填充页面时,效率甚至更低。

相同的实体不应分布在多个表中,除非您有非常非常好的理由。这不是一个很好的理由。一种简单的解决方案是阻止用户访问基表。只需让他们访问视图或用户定义的表函数 - 并让所有这些过滤器过滤用户 ID。

在某些极端情况下,您确实希望为每个用户提供单独的表。通常,每个用户都有一个非常复杂的表(想想 B2B 应用程序),事实上,他们可能有自己的数据库。分离数据可能还有法律要求。但是,在这些情况下,“分离性”通常是在数据库级别,而不是级别。


推荐阅读