简单而做作的例子:
C#桌面应用程序与SQL Server数据库对话。所有订单都存在于订单表中。
应用程序视图,创建和修改订单。在此示例中,用户只能修改自己的订单。
关注:
如果使用专用的sql凭据,则存储连接字符串。 即使使用了用户凭证,也可以通过直接通过Excel或Access连接来绕过应用程序安全性。
解决方案:
仅通过Web服务/中间件提供对SQL的访问。好,但在这种情况下不一定可行。
在应用程序的某处加密连接字符串。通过默默无闻的安全性不是很大。
通过授予对特定存储过程,视图等的访问权限来保护数据库,并且无法访问实际表。 SP和视图考虑了用户的权限/凭证。太可怕了。好的简单示例(选择用户,在介绍不同组中的用户,经理关系等时变得复杂)
备选方案:
你会怎么做?
由于
答案 0 :(得分:5)
你是什么意思?您不应该允许用户直接连接到SQL Server或使用Excel或Access。他们不应该知道sa或其他密码。即使使用了用户凭据,也可以使用应用程序安全性 通过直接通过Excel或Access
连接来绕过
在此之后,您肯定可以加密应用的某些部分,配置以便没有人可以看到其内容。
我真的有这样的逻辑:用户只能在应用程序级别修改他/她自己的订单。也可以在我猜的存储过程中完成,但它取决于更多细节应该知道这个建议最佳或最合适的方法。
答案 1 :(得分:3)
使用Windows身份验证而不是sql身份验证。
要允许用户仅查看他们的数据,您可以使用SYSTEM_USER创建基于当前登录用户的视图和过滤数据,仅获取当前用户的数据,并拒绝表本身的选择权限。
答案 2 :(得分:1)
您无法在SQL Server中执行行级安全性(you can},但这并不简单)。因此,您完全安全的唯一选择是通过控制访问的数据层。您可以加密存储您的凭据,但这并不完全安全,正如您所说。这取决于你的需要。
答案 3 :(得分:1)
在我们的应用程序中,我们处理存储加密在文件中的连接字符串。 因此用户无法直接访问此文件。 我们还仅对我们的数据库使用sql连接,并仅为此授予用户。
如果您使用Windows凭据来访问它并希望阻止任何操作,则可以禁止对表的写访问权限。 要读取数据,您可以构建查询或访问表。
对于写入/添加/操作数据,您可以创建存储过程。其中一个参数是用户名。在构建业务逻辑的过程中,模拟具有最终写入/更新数据的写访问权限的用户。 在SQL服务器中有你的“层”。 但我不建议采取这种方式:)这是可能的,但数据库内的许多业务逻辑imho。因此,最安全的方法是使用您的语言找到一个好的加密类,只使用sql auth并将这些数据存储在您的代码中。