出于安全原因,阻止ado.net使用sp_execute

时间:2014-01-02 15:16:49

标签: sql-server ado.net

使用ADO.NET时,请注意以下语句:

OPEN SYMMETRIC KEY sym_RegAna_Default DECRYPTION BY ASYMMETRIC KEY asym_RegAna_Default WITH PASSWORD = 'a very secure password :-)'

实际上是以:

的形式发送到SQL Server
exec sp_executesql N' OPEN SYMMETRIC KEY sym_RegAna_Default DECRYPTION BY ASYMMETRIC KEY asym_RegAna_Default WITH PASSWORD = ''a very secure password :-)'' ;

因为它是作为动态SQL字符串发送的,所以您可以使用SQL事件探查器查看密码。

启动SQL跟踪将产生以下输出:

  

exec sp_executesql N'Open SYMMETRIC KEY sym_RegAna_Default DECRYPTION   BY ASYMMETRIC KEY asym_RegAna_Default WITH PASSWORD =''非常安全   密码:-)'';

我知道修复此问题的唯一方法是不使用sp_execute将其作为动态SQL执行,而是直接使用查询。这样,SQL Server将识别出它是一个敏感查询,并将用以下内容替换跟踪输出:

--*OPEN SYMMETRIC KEY----------------------------

是否可以强制ADO.NET NOT 使用sp_execute?

(我搜索了这个,我可以找到类似的问题,但它们总是变成执行计划缓存问题/参数嗅探)

作为背景参考,This问题是我提问的触发器。

1 个答案:

答案 0 :(得分:0)

我一直在寻找答案,在Google上找不到任何东西,直到我终于遇到这个: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.serverconnection.aspx

您可以使用此ServerConnection对象在不使用sp_executesql的情况下执行查询。 这可以使用ADO.Net SqlConnection完成,因此您可以在密钥打开后继续使用ADO.Net。

SqlConnection sqlConnection = new SqlConnection();

ServerConnection serverConnection = new ServerConnection(sqlConnection);
serverConnection.ExecuteNonQuery("OPEN SYMMETRIC KEY sym_RegAna_Default DECRYPTION BY ASYMMETRIC KEY asym_RegAna_Default WITH PASSWORD = 'a very secure password :-)'");

-- Do ADO.Net work with sqlConnection