如何在没有数据库连接的情况下使用 SQL Server 类(例如 SqlCommand)来防止 SQL 注入?

How can I use SQL Server classes (e.g. SqlCommand) to prevent SQL injection WITHOUT database connection?

我目前正在检查 Whosebug 以了解有关使用 C# 代码防止 SQL 注入的最佳实践,许多答案包括 .NET SQL 类,例如 SqlCommand , SqlDataAdapter, ...

问题是我必须使用专有的中间件组件将查询发送到数据库,而且我找不到任何方法来使用这些 类 而不使用 SqlConnection

这是我的示例代码:

SqlCommand sqlC = new SqlCommand("USP_MyProcedure");
sqlC.CommandType = System.Data.CommandType.StoredProcedure;
sqlC.Parameters.AddWithValue("@strRef", strRef);
sqlC.Parameters.AddWithValue("@strCmd", strCmd);
sqlC.Parameters.AddWithValue("@strParam", strParam);
sqlC.Parameters.AddWithValue("@strDef", strDef);
sqlC.Parameters.AddWithValue("@strWn", sWn);

SqlCommand 似乎正确初始化,SqlParameterCollection 似乎正常,但 属性 SqlC.CommandText returns 仅 "USP_MyProcedure".

如果我用其他类来处理我的SqlCommand,例如:

SqlDataReader reader = sqlC.ExecuteReader();

我收到一个错误消息,因为我没有可用的连接:

The connection property has to be initialized

所以,我的问题是:

编辑:看来我误解了那些 类 的工作原理。

那些 类 不准备 SQL 语句 "offline" 并且设计为与 SqlConnection 一起使用。

不过我可以换个角度问:有.NET 类准备SQL语句"offline"防止注入吗?

SqlCommand 旨在与 SqlConnection 一起使用以专门查询 MS SQL 服务器 - 它不是设计为 "generic" SQL 命令适用于使用自己的连接方法的任何中间件或任意提供程序。您也不能将它用于一般的 "prepare" 文本 SQL 命令。

如果您的中间件要与 ADO.NET 兼容,则它应该提供自己的 command/connection 类型。如果没有,那么您可能会遇到文本查询和连接字符串的问题,并且需要找到其他方法来防止 SQL 注入(清理注释标记、转义引号等)

are there .NET classes to prepare SQL statements "offline" against injection?

没有