2016-10-28 2 views
3

Я изучал отчет о безопасности, созданный для приложения ASP.NET WebForms. Некоторые области нашего кода, как было отмечено, являются потенциальными уязвимостями SQL-инъекций. Я изучал эти области в нашей кодовой базе, и все они, кажется, там, где мы импортируем книги Excel. Код нарушения выглядит, когда мы пытаемся создать OleDbCommand на основе имени первого листа в книге. Мы создаем соединение с базой данных (excel sheet) с использованием объекта OleDbConnection, который считывает схему базы данных, чтобы найти имя первого листа. Затем мы динамически создаем команду SQL, используя это имя. Пример кода может выглядеть следующим образом:Уязвимости SQL Injection при импорте Excel

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 Injection уязвимости Я искал в альтернативы коды выше. Кто-нибудь есть идеи, как я могу выполнить это, не будучи помеченным как уязвимость SQL Injection? Я не хочу использовать офисные объекты ActiveX для выполнения этой операции.

+0

будет просто двигаться в этом логика в хранимую процедуру исправляет уязвимость? –

+1

готовые заявления не будут работать здесь, потому что заполнители в подготовленных операторах могут представлять только VALUES, а не идентификаторы. Вам придется использовать обычные методы экранирования sql. –

+1

Вот информация о методах эвакуации SQL и связанных с ними вещах: http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and-surrounding-use – HaukurHaf

ответ

0

Если вы знаете список возможных таблиц, вы можете создать белый список этих таблиц, а затем проверить имена таблиц на этот белый список, как в первом примере. Вы также можете выполнить проверку фильтра методом String, как во втором примере. Вы также можете сделать проверку 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 
}