.net 识别连接到SQL Server 2005的应用程序

.net 识别连接到SQL Server 2005的应用程序,.net,sql-server,sql-server-2005,security,.net,Sql Server,Sql Server 2005,Security,我想知道什么应用程序连接到数据库并执行SPs。 (我想将SP执行限制为仅我的应用程序-所有其他应用程序-例如MS SSMS将被忽略) 那么,有没有办法找到连接的客户端名称 如果没有,也许你有其他建议如何确保只使用专用的应用程序 (应用程序正在使用Windows的集成安全性) 编辑:我试图解决的问题: 我正在开发内置的应用程序用户权限和角色模块。 所以,应用程序从DB(通过SPs)接收所有字段,然后业务逻辑决定向哪个用户显示(或不显示)什么 我担心更有经验的用户:他可以运行自己的应用程序,连接到数

我想知道什么应用程序连接到数据库并执行SPs。
(我想将SP执行限制为仅我的应用程序-所有其他应用程序-例如MS SSMS将被忽略)

那么,有没有办法找到连接的客户端名称

如果没有,也许你有其他建议如何确保只使用专用的应用程序 (应用程序正在使用Windows的集成安全性)

编辑:我试图解决的问题:

我正在开发内置的应用程序用户权限和角色模块。
所以,应用程序从DB(通过SPs)接收所有字段,然后业务逻辑决定向哪个用户显示(或不显示)什么

我担心更有经验的用户:他可以运行自己的应用程序,连接到数据库,并忽略所有安全限制。
这就是为什么我想确保DB只与此应用程序对话


连接字符串param是一种解决方案,但很容易嗅探-我想知道是否还有另一个选项

应用程序名称可以是连接字符串的一部分,但可以伪造。如果您需要强制执行此操作,那么我将抽象对应用服务器的数据访问,并通过此操作(可能使用web服务)从客户端进行数据访问。然后,您的应用程序服务器可以使用已知帐户与服务器对话(作为“受信任的子系统”),而单个客户端实际上不需要访问数据库(win:win,特别是当涉及防火墙时)


就我个人而言,我倾向于将此作为我的默认模型。。。它从一开始就增加了很多未来的可伸缩性,而且很难在事后添加。

要将客户端应用程序的名称传递给SQL Server,请在连接字符串中设置“Application name”参数。您可以使用
app\u name()
函数在SQL Server中检索此值

但是,如果您想对不同的应用程序强制执行不同的权限,那么您必须为每个应用程序定义一个带有密码的标准登录,而不是使用集成登录。

您看过在SQL Server中使用吗

您可以将所有必要的权限仅授予应用程序角色,并且数据库登录将只授予Public成员,而不授予其他权限。这样,即使有人通过ManagementStudio或其他直接连接获得访问权限,他们也无法在不知道应用程序角色凭据的情况下在数据库中执行任何操作

编辑:在下面增加了一节关于加密的内容,试图解决Maicej的评论


对于字段级粒度,您可以使用SQL 2005及更高版本中的内置加密功能,将各种角色的读取权限限制为特定字段。这仅适用于少数加密字段,而不适用于整行。关于加密SSN/信用卡信息的问题,我提供了一个代码示例,说明如何使用加密功能来确保只有某些用户可以解密字段中的数据。该示例当前设置为使用数据库用户,但也可以适应应用程序角色。如果您选择使用密码加密密钥,还可以防止具有系统管理员权限的DBA也能够解密加密的数据。

在Windows上唯一可以验证的是用户。没有安全的方法来建立应用程序的身份。因此,任何限制对特定应用程序访问的尝试都可能被动机充分的攻击者击败

您可以通过添加密码来保持意外登录的诚实。在触发器中,您可以从连接字符串中检查声明的“应用程序名称”,如果没有,则关闭连接。这将阻止某人意外连接到您的服务器。但是,它不会阻止有动机的管理员访问数据,因为应用程序名称可能被欺骗。此外,如果您有任何类型的管理和维护任务,则管理员和维护任务需要访问您的数据库

一个稍微好一点的方法是通过Approve控制对数据的访问。approle启用了对应用程序的访问,您仍然可以使用自定义应用程序逻辑进行内容管理限制(“列”限制和您引用的其他限制)。这将稍微提升条,以便只有您的应用程序可以修改和访问数据。这将阻止非管理员访问您的数据,但特权管理员将(始终)能够做他或她想做的任何事情

最后,通过部署加密还有更高的门槛。这需要一个真正有决心的管理员来超越这一点,需要一个管理员必须采取特定的步骤来找出你的关键密码,他不会意外地发现它们。正如我所说,一个专门的管理员将始终能够访问您的数据


另一种方法是不部署任何屏障,而是使用审计来监视数据。可以在SQL Server中进行防篡改审计,公布审计通常具有足够的威慑力。

您实际试图解决的问题是什么?正如建议的那样,我已将应用程序名称param添加到连接字符串中。但在执行SELECT host_name()查询时,它只返回连接的工作站名称。缺少什么?好的,我找到了()我可以通过选择app_name()来读取app name查询我知道SQL Server中的角色。我需要在字段级别(R/W)上设置权限,这意味着一个用户可以看到某个字段(R),而另一个用户看不到同一个字段。应用程序管理员也有一个界面,他可以决定用户可以看到/做什么。如果我错了,请纠正我,但我认为SQL的角色没有那么灵活。