SqlCommand - 阻止在其他数据库中存储的proc调用

时间:2010-03-30 06:19:40

标签: sql-server ado.net

当使用SqlCommand通过RPC调用存储过程时,看起来可以在当前数据库以外的数据库中调用存储过程。

e.g。 :

string storedProcName = "SomeOtherDatabase.dbo.SomeStoredProc";    
SqlCommand cmd = new SqlCommand(storedProcName);
cmd.CommandType = CommandType.StoredProcedure;

我想通过禁止对另一个数据库的潜在调用来使我的DAL代码更具限制性。一种方法可能是检查上面的storedProcName中是否有两个句点(点),如果是,则抛出异常。还有其他想法/方法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

通常在服务器端配置此类限制 SQL Server有一个非常广泛的安全模型,它允许它通过向特定数据库对象(表,视图,特性)的特定“主体”(用户或组)授予特定权限(“读取”,“写入”等)来提供非常精细的访问。存储过程,模式...)

您建议让DAL层应用一些限制以防止在与ADO连接关联的默认数据库之外使用存储过程,这表明了对“发送到SQL”的主动态度。一般来说这是一种有价值的态度(例如防止SQL注入),但在这种情况下,我建议反对它:
如果在将来某个时候需要特定的“外部”存储过程怎么办?另外,如果当前数据库上有多个存储过程应该是对应用程序的限制(因为它们仅用于维护/数据加载/审计/其他),该怎么办?通过引入一些DAL级别限制,您可能会在以后设置自己的困难,并且可能会让您相信访问控制是足够的,它可能不是......

答案 1 :(得分:1)

您的数据库中可能存在名称中包含点的程序:

create procedure dbo.[Dots.In.Name]
as

正如hallie所说,你最好保护服务器(不要在其他数据库中为SqlConnection使用的任何帐户授予任何权限)。

此外,如果您正在处理2005或2008数据库,则当前数据库中可能存在实际引用其他数据库的同义词,当然,当前数据库中的任何存储过程都可能在另一个数据库中调用存储过程。服务器/数据库。

基本上,控制数据库服务器(控制创建的对象以及授予的权限),并编写更少的代码,试图覆盖服务器现在可以充分响应的情况。

相关问题