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)
我收到一个错误,因为我没有可用的连接:
必须初始化连接属性
所以,我的问题是:
编辑:看起来我误解了这些课程的工作方式。
这些类不会“离线”准备 SQL 语句,而是设计为与 SqlConnection 一起使用。
但我可以改变问题,从另一个角度提出问题:是否有 .NET 类可以“离线”准备 SQL 语句以防止注入?
SqlCommand设计用于SqlConnection专门查询 MS SQL Server - 它不是设计为“通用” SQL 命令,该命令适用于任何中间件或使用自己的连接方法的任意提供程序。您也不能使用它来一般地“准备”文本 SQL 命令。
如果要与 ADO.NET 兼容,您的中间件应该提供自己的命令/连接类型。如果没有,那么您可能会遇到文本查询和连接字符串的问题,并且需要找到其他方法来防止 SQL 注入(清除注释标记、转义引号等)
是否有 .NET 类可以“离线”准备 SQL 语句以防止注入?
不。