Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataAdapter.SelectCommand和SQL注入_C#_Sql - Fatal编程技术网

C# DataAdapter.SelectCommand和SQL注入

C# DataAdapter.SelectCommand和SQL注入,c#,sql,C#,Sql,我有一个带有导出功能的桌面应用程序 导出列位于配置文件中。当前,数据库检索后,将从数据集中删除未包含的列 导出的db检索部分现在类似于: var sql = "SELECT * FROM WHATEVER WHERE ID=:ID"; using (var cmd = ConFactory.CreateOracleCommand()) { cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = id; cmd.Co

我有一个带有导出功能的桌面应用程序

导出列位于配置文件中。当前,数据库检索后,将从数据集中删除未包含的列

导出的db检索部分现在类似于:

var sql = "SELECT * FROM WHATEVER WHERE ID=:ID";

using (var cmd = ConFactory.CreateOracleCommand())
{
      cmd.Parameters.Add("ID", OracleDbType.Varchar2).Value = id;
      cmd.CommandText = sql;

      using (var dataAdapter = new OracleDataAdapter())
      {
          dataAdapter.SelectCommand = cmd;
          dataAdapter.Fill(ds);
      }
      ...
}
然而,当数百个列中通常只有一个或两个配置为导出时,这是非常浪费的

因此,为了提高效率,我希望将配置文件中指定的列传递给该方法,并将sql重写为如下内容:

// columns is List<string>
string sColumns = string.Join(",", columns);

var sql = string.Format("SELECT {0} FROM WHATEVER WHERE ID=:ID", sColumns);
//列在列表中
string sColumns=string.Join(“,”列);
var sql=string.Format(“从ID=:ID的任何位置选择{0}”,sColumns);
但是,如果有人在配置文件中输入了不好的内容,那么在dataAdapter.SelectCommand&Fill中使用这种方法是否有问题?SQL注入安全吗?我还没有找到关于它的任何文档


从列中的字符串列表中删除所有空格“”是否有帮助?

有很多关于ADO.NET命令的文档。安全性来自使用参数化查询,而不是使用OracleCommand本身。如果添加未初始化的字符串,则会使自己暴露于SQL注入。但是,为什么要使用数据适配器,特别是如果希望在运行时更改列的话?为什么不使用像EF这样的ORM,只使用
.Select()
?如果要导出数据,使用DataTable只需在处理第一行之前加载RAM中的所有内容,从而浪费内存。您可以使用
cmd.ExecuteReader()
并在行到达时导出它们。像
CsvHelper
或EppPlus这样的库接受读卡器作为输入来生成CSV或Excel文件<编码>选择X;放下桌子;从任何地方…。。。我希望你明白了already@PanagiotisKanavos谢谢,但不要使用EF,因为这不是绿地应用程序。我只是在寻找一种方法来优化已经存在的东西,以便在不做太多改变的情况下快速取胜。@Camiloterivento是的,我明白了这一点,因此提出了这个问题。但正如我所写的,对于每个配置的列,所有空白都被删除。因此,该示例将生成sql“SELECT X;droptablewhich;FROM which”。