如何保护C#应用程序访问的sql Server

如何保护C#应用程序访问的sql Server,c#,sql-server,security,C#,Sql Server,Security,简单而人为的例子: C#桌面应用程序与SQL Server数据库对话。订单表中存在所有订单 应用程序查看、创建和修改订单。在本例中,用户只能修改自己的订单 关注事项: 如果使用专用sql凭据,则存储连接字符串。 即使使用了用户凭据,也可以通过Excel或Access直接连接绕过应用程序安全性 解决方案: 仅通过web服务/中间件提供对SQL的访问。很好,但在这种情况下不一定可行 加密应用程序中的连接字符串。不是非常安全,通过默默无闻的安全 通过授予对特定存储过程、视图等的访问权限而不授予对实际表

简单而人为的例子:

C#桌面应用程序与SQL Server数据库对话。订单表中存在所有订单

应用程序查看、创建和修改订单。在本例中,用户只能修改自己的订单

关注事项:

如果使用专用sql凭据,则存储连接字符串。 即使使用了用户凭据,也可以通过Excel或Access直接连接绕过应用程序安全性

解决方案:

仅通过web服务/中间件提供对SQL的访问。很好,但在这种情况下不一定可行

加密应用程序中的连接字符串。不是非常安全,通过默默无闻的安全

通过授予对特定存储过程、视图等的访问权限而不授予对实际表的访问权限来保护数据库。SP和视图会考虑用户的权限/凭据。非常糟糕。对于简单的示例(选择用户所在的位置,一旦您介绍不同组中的用户、经理关系等,就会变得复杂)

备选方案:

你将如何处理这个问题

谢谢

即使使用了用户凭据,应用程序安全性也可能受到影响 通过Excel或Access直接连接绕过

您的意思是什么?您不应该允许用户直接连接到SQL Server或使用Excel或Access。他们不应该知道sa或其他密码

在这之后,你当然可以对你的应用程序的某些部分进行加密,这样就没有人能看到它的内容了


我真的有这样一种逻辑,即用户只能在应用程序级别修改他/她自己的订单。我想也可以在存储过程中进行修改,但这取决于具体情况,并且应该了解更多有关这方面的详细信息,以建议最佳或最合适的方法。

使用windows身份验证而不是sql身份验证


要允许用户仅查看其数据,您可以使用创建视图并根据当前登录的用户筛选数据,方法是:仅获取当前用户的数据,并拒绝对表本身的select权限。

SQL Server中无法执行行级安全性(好吧,但这并不简单)。因此,要完全安全,您唯一的选择是通过一个控制访问的数据层。您可以加密存储凭据,但正如您所说,这并不完全安全。这取决于您需要什么。

在我们的应用程序中,我们将加密的连接字符串存储在一个文件中。 因此,用户无法直接访问此文件。 我们也只使用sql连接到我们的数据库,并只为此授予用户权限

若您使用Windows凭据访问该表,并希望防止任何操纵,则可以禁止对该表的写入访问。 为了读取数据,您可以构建查询或访问表

对于写入/添加/操作数据,您可以创建存储过程。其中一个参数是用户名。在您构建业务逻辑的过程中,模拟具有写入权限的用户,以最终写入/更新数据。 在这里,您的“层”位于SQL server内部。
但我不建议这样做:)这是可能的,但数据库中的许多业务逻辑是不可能的。因此,最安全的方法是在您的语言中找到一个好的加密类,只使用sql auth,并将这些数据存储在代码中。

是的,我也想提出这一点,但我认为他面临的问题是,在这种情况下,用户可以连接Access或其他工具,修改与自己无关的订单。如果我的问题是对的,那当然是戴维德。如果我们授予他们NT权限,理论上他们可以在Excel中打开一个连接,或者访问并读取(或者可能写入)他们想要的任何旧数据。谢谢Giorgi。我在这方面遇到的一个问题是,有时编辑权限可能也取决于用户的组访问权限。现在我也可以在sql中定义这些组关系,实际上我们最终可能会这样做,但是如果我们最终使用ActiveDirectory,那么事情会变得更复杂。我同意,但是如果他们获得了凭据,或者如果他们被设置为拥有NT凭据授予的访问权限,他们可以进入。我认为这是我最有意义的途径。该应用程序使用SQLAuth(web.config中的连接字符串),并且只能通过一些DAL进行访问,DAL根据用户ID过滤结果。是否存在一些不必要的漏洞?您好,nycdan,是的,如果用户能够访问未加密的连接字符串,他们可以连接到数据库并执行该帐户有权执行的任何操作。如果连接是通过集成安全性进行的,那么他们只需要服务器名称。它不会是web.config,因为它不是web应用程序,因此配置文件存在于本地计算机上。如果我们不使用集成的,我想加密会有帮助。只是看看其他人是如何做到这一点的。通常我会选择服务层,但在这种情况下,它是一个从桌面直接访问数据库的单片应用程序。谢谢,非常感谢。我完全同意,我讨厌sql server本身的“层”,它感觉太晚了90年代:)记住对数据输入进行sanatize: