如何在没有数据库连接的情况下使用 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
所以,我的问题是:
- 有没有办法使用那些 .NET 类(或其他?)来准备我的 SQL 查询以防止 SQL 注入?
- 如果没有,是否有其他 .NET 类 来防止 SQL 注入,或者我是否必须自己实施反 SQL 注入方法?从您的角度来看,基于哪种最佳实践?
编辑:看来我误解了那些 类 的工作原理。
那些 类 不准备 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?
没有
我目前正在检查 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
所以,我的问题是:
- 有没有办法使用那些 .NET 类(或其他?)来准备我的 SQL 查询以防止 SQL 注入?
- 如果没有,是否有其他 .NET 类 来防止 SQL 注入,或者我是否必须自己实施反 SQL 注入方法?从您的角度来看,基于哪种最佳实践?
编辑:看来我误解了那些 类 的工作原理。
那些 类 不准备 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?
没有