SQL注入漏洞与Excel导入

我一直在研究为ASP.NET WebForms应用程序生成的安全报告。 我们的代码中的某些区域已被注意到是潜在的SQL注入漏洞。 我一直在我们的代码库中查看这些领域,他们似乎都是我们正在导入excel工作簿的地方。 有问题的代码似乎是当我们正在尝试基于工作簿中的第一个工作表的名称创build一个OleDbCommand。 我们正在使用OleDbConnection对象连接数据库(Excel工作表),该对象读取数据库模式以查找第一个工作表的名称。 然后我们使用这个名字dynamic地构造一个SQL命令。 示例代码可能如下所示:

String connectionString = String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};" + "Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\"", sFullPath); OleDbConnection conn = new OleDbConnection(connectionString); conn.Open(); DataTable dbSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string firstSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); using (OleDbCommand command = new OleDbCommand("SELECT * FROM [" + firstSheetName+ "]", conn)) // Offending line of code 

为了修复这个SQL注入漏洞,我一直在寻找上述代码的替代品。 有没有人有任何想法,我可以执行此操作,而不被标记为SQL注入漏洞? 我不想使用ActiveX office对象来执行此操作。

如果您知道可能的表格列表,则可以创build这些表格的白名单,然后根据第一个示例检查电子表格名称与白名单。 你也可以像第二个例子那样做一个过滤string方法validation。 您也可以执行RegEx检查,就像在上一个代码示例中一样

以下是您可能适用于执行此过滤的一些示例代码(我只留下白名单检查未注释):

 bool targetStringInArray = false; //Table name is in the whitelist targetStringInArray = Array.Exists(tables, element => element == firstSheetName); //Table Begins with begin with 'q' //string[] tables = { "start", "q1","q3", "fyend", "q4"}; //targetStringInArray = Array.Exists(tables, firstSheetName=> firstSheetName.StartsWith("q")); //Table name is only letters, numbers and underscores: //targetStringInArray = Regex.IsMatch(firstSheetName, @"^[a-zA-Z0-9_]+$"); if (targetStringInArray) { using (OleDbCommand command = new OleDbCommand("SELECT * FROM [" + firstSheetName+ "]", conn)) // Offending line of code }