我目前正在检查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);
SqlCommand
似乎已正确初始化,SqlParameterCollection
似乎正常,但属性SqlC.CommandText
仅返回"USP_MyProcedure"。
如果我使用其他类来处理我的SqlCommand
,例如:
SqlDataReader reader = sqlC.ExecuteReader();
我收到一个错误,因为我没有可以使用的连接:
必须初始化连接属性
所以,我的问题是:
- 有没有办法使用这些.NET类(或其他类?(来准备我的SQL查询以防止SQL注入?
- 如果没有,是否有其他 .NET 类来防止 SQL 注入,或者我是否必须自己实现反 SQL 注入方法?从您的角度来看,基于哪种最佳实践?
编辑:看起来我误解了这些类的工作原理。
这些类不准备"脱机"的 SQL 语句,并且设计为与 SqlConnection 一起使用。
但是我可以改变这个问题,从另一个角度提出来:是否有 .NET 类来准备针对注入的"离线"SQL 语句?
SqlCommand
旨在与SqlConnection
一起使用以专门查询MS SQL Server - 它不是设计为针对任何中间件或使用自己的连接方法的任意提供程序的"通用"SQL命令。您也不能使用它来一般地"准备"文本SQL命令。
如果中间件要与 ADO.NET 兼容,则应提供自己的命令/连接类型。如果没有,那么您可能会遇到文本查询和连接字符串的问题,并且需要找到其他方法来防止SQL注入(清理注释标记,转义引号等(。
是否有 .NET 类来准备针对注入的"脱机"SQL 语句?
不。