【发布时间】:2016-10-28 15:17:16
【问题描述】:
我一直在研究为 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 office 对象来执行此操作。
【问题讨论】:
-
是否会简单地将这个逻辑移动到存储过程中来修复漏洞?
-
首选防御,准备好的语句,在这里不起作用,因为准备好的语句中的占位符只能表示值,而不是标识符。您将不得不使用传统的 sql 转义技术。
-
这里有一些关于 SQL 转义技术和相关内容的信息:stackoverflow.com/questions/139199/…
-
@EdwardHeyne
Will simply moving this logic into a stored proc fix the vulnerability?没有。
标签: c# sql asp.net excel sql-injection