C# DataAdapter.SelectCommand和SQL注入
我有一个带有导出功能的桌面应用程序 导出列位于配置文件中。当前,数据库检索后,将从数据集中删除未包含的列 导出的db检索部分现在类似于: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
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”。