ranio Ответов: 3

Как проверить, что файл excel/ csv содержит нежелательные специальные символы при чтении и загрузке их в C#?


Я читаю файл excel и сохраняю данные в БД через элемент управления Fileupload в asp.net с помощью c#.

Проблема в том, что пользователь экрана истории загруженных файлов может загрузить и инъекционные атаки могут быть установлены на загруженные файлы. Поэтому мне нужно блокировать инъекционную атаку во время самой загрузки

Мне нужно прочитать файл полностью и проверить, что же содержат эти символы (+, =, "", @) и проверить правильность самой загрузки. Если он будет читать строку за строкой, это вызовет проблему производительности/тайм-аута, особенно с массовыми файлами.

Что я уже пробовал:

Основной код выглядит следующим образом:
(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
		Server.MapPath("example.xls") + ";
		Extended Properties=Excel 8.0");//OledbConnection and 
				// connectionstring to connect to the Excel Sheet
        try
        {
            //After connecting to the Excel sheet here we are selecting the data 
	   //using select statement from the Excel sheet
	   OleDbCommand ocmd = new OleDbCommand("select * from [Sheet1$]", oconn);
	            oconn.Open();  //Here [Sheet1$] is the name of the sheet 
				//in the Excel file where the data is present
            OleDbDataReader odr = ocmd.ExecuteReader();
            string fname = "";
            string lname = "";
            string mobnum = "";
            string city = "";
            string state = "";
            string zip = "";
            while (odr.Read())
            {
                fname = valid(odr, 0);//Here we are calling the valid method
                lname = valid(odr, 1);
                mobnum = valid(odr, 2);
                city = valid(odr, 3);
                state = valid(odr, 4);
                zip = valid(odr, 5);
                //Here using this method we are inserting the data into the database
	       insertdataintosql(fname, lname, mobnum, city, state, zip);
            }
            oconn.Close();
        }
        catch (DataException ee)
        {
            lblmsg.Text = ee.Message;
            lblmsg.ForeColor = System.Drawing.Color.Red;
        }
        finally
        {
            lblmsg.Text = "Data Inserted Sucessfully";
            lblmsg.ForeColor = System.Drawing.Color.Green;
        }

3 Ответов

Рейтинг:
2

Maciej Los

Во-первых, у вас серьезные проблемы с вашим кодом:

while (odr.Read())
{
    //...
    insertdataintosql(fname, lname, mobnum, city, state, zip); //here!
}

Представьте себе, каждый раз, когда вы звоните insertdatainstosql метод, ваш sql-сервер открывает новый операция[^Отметим, что транзакции позволяют обезопасить себя от негативных последствий ситуации актуальности данных, связав множество операций на основе в одно логическое целое. Инструкции, выполняемые как часть транзакции, рассматриваются как единое целое и до тех пор, пока они не будут утверждены, они не изменяют данные. Но когда 2 процесса с конкурируют за эксклюзивный доступ к ресурсу, но не могут получить эксклюзивный доступ к нему, потому что другой процесс препятствует этому, то тупик происходит. Видеть:
Взаимоблокировки SQL Server на примере - простой разговор[^]
Обработка взаимоблокировок в SQL Server - простой разговор[^]

Instaed вставки данных в цикл, о котором вы должны узнать: Выполнение Операций Массового Копирования (Microsoft Docs)[^]. Есть специальный класс: Класс SqlBulkCopy (System.Data.SqlClient)[^], который обеспечивает способ эффективной массовой загрузки таблицы SQL Server данными из другого источника.


Можно запретить вводить ненужные символы (+, =, "", @) в базу данных с помощью ЗАМЕНЯТЬ[^] функция с SELECT заявление
SELECT REPLACE(REPLACE(REPLACE(Column1, '+', ''), '=', ''), '@', '') AS Column1
FROM [Sheet1$]


Рейтинг:
1

OriginalGriff

Если вы беспокоитесь о инъекционных атаках, то вам нужно посмотреть на свой insertdataintosql метод - который мы не можем видеть - и весь ваш другой код, который обращается к электронной таблице. То, что вы ищете, - это конкатенация строк.

Никогда не объединяйте строки для построения команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что источник получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается источника, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то источник получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать данные из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Рейтинг:
1

Patrice T

Вот небольшая лекция о SQL инъекции:
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]

Цитата:
атака с помощью инъекции csv или так было сказано.

Не существует.


ranio

Что мне нужно, так это проверить наличие специальных символов, таких как+,=,"", @ в массовых файлах(excel/csv). Не имеет отношения к Sql.

Patrice T

О каких "инъекционных атаках" вы говорите ?

ranio

атака с помощью инъекции csv или так было сказано. Для этого специальные символы упоминаются выше, и мне нужно блокировать, если они есть, не читая строку за строкой, которые вызывают проблемы с производительностью.