首页 > 解决方案 > DataAdapter.SelectCommand 和 SQL 注入

问题描述

我有具有导出功能的桌面应用程序。

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

导出的 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);

但是,如果有人在配置文件中输入了错误的内容,那么在 dataAdapter.SelectCommand 和 Fill 中使用这种方法有什么问题吗?SQL注入安全吗?我还没有找到任何关于它的文档。

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

标签: c#sql

解决方案


推荐阅读