SQL注入漏洞与Excel导入
本文关键字:Excel 导入 漏洞 注入 SQL | 更新日期: 2023-09-27 18:15:28
我一直在研究一个为ASP生成的安全报告。. NET WebForms应用程序。我们的代码中的一些区域被注意到存在潜在的SQL注入漏洞。我一直在我们的代码库中研究这些领域,它们似乎都是我们导入excel工作簿的地方。违规代码似乎是当我们试图根据工作簿中第一个工作表的名称创建OleDbCommand时。我们使用OleDbConnection对象与数据库(excel工作表)建立连接,该对象读取数据库模式以查找第一个工作表的名称。然后使用该名称动态构造一个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办公对象执行此操作
如果您知道可能的表列表,您可以创建这些表的白名单,然后根据白名单检查电子表格名称,如第一个示例所示。您还可以像第二个示例那样执行过滤字符串方法验证。您还可以执行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
}