如何清理sql参数

时间:2018-03-22 09:50:18

标签: c#

我写这些代码都工作正常,但有一个警告来清理sql参数。

private DataSet ExcelToDataSet(string fileData)
    {
        DataSet ds = new DataSet();

        string connectionString = GetConnectionString(fileData);

        using (OleDbConnection conn = new OleDbConnection(connectionString))
        {
            conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;

            // Get all Sheets in Excel File
            DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            // Loop through all Sheets to get data
            foreach (DataRow dr in dtSheet.Rows)
            {
                string sheetName = dr["TABLE_NAME"].ToString();

                if (!sheetName.EndsWith("$"))
                    continue;

                // Get all rows from the Sheet
                cmd.CommandText = "SELECT * FROM [" + sheetName + "]";

                DataTable dt = new DataTable();
                dt.TableName = sheetName;

                OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                da.Fill(dt);

                ds.Tables.Add(dt);
            }

            cmd = null;
            conn.Close();
        }

        return (ds);
    }

我必须清理以下行

cmd.CommandText = "SELECT * FROM [" + sheetName + "]";

2 个答案:

答案 0 :(得分:0)

通常,在编写SQL语句时,需要使用参数将数据从用户输入传递到sql语句中,以防止SQL注入攻击。这就是你得到这个警告的原因。但是,由于无法在SQL中参数化标识符,因此您无需执行此操作,因为您没有连接用户输入,并且您没有运行此查询一个数据库,所以即使你可以使用SQL注入,你可以做的最糟糕的事情就是破坏一个文件

答案 1 :(得分:0)

更新:我没有注意到这是OleDbConnection,您要连接的数据库可能没有引用标识符的相同功能。我在这里留下这个答案,以防有人遇到这个问题并且需要相同的东西,但是对于SQL连接。

正如其他人所说,在这种情况下无需担心警告,因为数据不是来自用户数据。

但是,如果您无法参数化标识符,那么每个人都错了。您需要动态构建查询服务器端并使用QUOTENAME函数,但这是可能的。

foreach (DataRow dr in dtSheet.Rows)
{
    string sheetName = dr["TABLE_NAME"].ToString();

    if (!sheetName.EndsWith("$"))
        continue;

    // Get all rows from the Sheet
    cmd.CommandText = @"
declare @sql nvarchar(114);
set @sql = N'select * from ' + quotename(@sheetname)
exec sp_executesql @sql
";
    cmd.Parameters.Clear();
    cmd.Parameters.Add("@sheetname", SqlDbType.NVarChar, 100).Value = sheetName;

    DataTable dt = new DataTable();
    dt.TableName = sheetName;

    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    da.Fill(dt);

    ds.Tables.Add(dt);
}

这将生成一个动态查询,可以安全地转义表的名称。