c# - Excel 导入的 SQL 注入(inject)漏洞

标签 c# sql asp.net excel sql-injection

<分区>

我一直在研究为 ASP.NET WebForms 应用程序生成的安全报告。我们代码中的某些区域已被注意到是潜在的 SQL 注入(inject)漏洞。我一直在研究我们的代码库中的这些区域,它们似乎都是我们导入 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 注入(inject)漏洞,我一直在寻找上述代码的替代方案。有谁知道我如何在不被标记为 SQL 注入(inject)漏洞的情况下执行此操作?我不想使用 ActiveX office 对象来执行此操作。

最佳答案

如果您知道可能的表格列表,您可以创建这些表格的白名单,然后根据该白名单检查电子表格名称,如第一个示例所示。您还可以像第二个示例一样进行过滤字符串方法验证。您还可以像上一个代码示例一样进行 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
}

关于c# - Excel 导入的 SQL 注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308183/

相关文章:

sql - 从表中选择列中至少包含一个字母的行

sql - Backspace 在 sqlplus 命令行中不起作用

css - 自定义光标在 IE8 中不起作用

c# - 找不到类型或 namespace 名称 'WebControls'(是否缺少using指令或程序集引用?)

c# - 来自 Visual Studio 2010 中所有注释的文档

c# - 如何在另一种方法中使用 MouseEventArgs?

C# 异步,为什么我们需要 "hold"控制台来获取异步结果?

c# - 使用 C# 将图像添加到电子邮件正文

mysql - 不重复和最小值

asp.net - 在 ASP.NET/IIS7 中可以进行多少个并发出站 HttpWebRequest 调用?