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

Aer*_*ron 0 c# sql-server sql-injection

我目前正在检查 StackOverflow 以获取有关使用 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);
Run Code Online (Sandbox Code Playgroud)

SqlCommand似乎正确初始化时,SqlParameterCollection看起来不错,但物业SqlC.CommandText仅返回“USP_MyProcedure”。

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

SqlDataReader reader = sqlC.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

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

必须初始化连接属性

所以,我的问题是:

  • 有没有办法使用那些 .NET 类(或其他类?)来准备我的 SQL 查询以防止 SQL 注入?
  • 如果没有,是否有其他 .NET 类可以防止 SQL 注入,或者我是否必须实现自己的反 SQL 注入方法?从您的角度来看,基于哪种最佳实践?

编辑:看起来我误解了这些课程的工作方式。

这些类不会“离线”准备 SQL 语句,而是设计为与 SqlConnection 一起使用。

但我可以改变问题,从另一个角度提出问题:是否有 .NET 类可以“离线”准备 SQL 语句以防止注入?

D S*_*ley 5

SqlCommand设计用于SqlConnection专门查询 MS SQL Server - 它不是设计为“通用” SQL 命令,该命令适用于任何中间件或使用自己的连接方法的任意提供程序。您也不能使用它来一般地“准备”文本 SQL 命令。

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

是否有 .NET 类可以“离线”准备 SQL 语句以防止注入?

不。