2016-02-06 3 views
2

Я использую asp.net mvc 4, чтобы создать сайт, на котором пользователь может загрузить файл .xlsx и сохранить данные в таблице MSSQL. Я хочу удостовериться, что перед сохранением данных не было никаких недопустимых символов, таких как инструкции SQL-инъекций в файле. До сих пор я тестировал $ знак, который отлично работает, но он будет только ловить, если ячейка имеет только этот символ, а не между символами. Вот мой код,Проверка незаконных символов при загрузке файла excel в asp.net mvc

Контроллер

public ActionResult BulkReadings() 
    { 
     string pathToExcelFile = System.IO.Path.Combine(Server.MapPath("~/ExcelFiles/"), "BulkReads.xlsx"); 
     string sheetName = "Sheet1"; 

     var excelFile = new ExcelQueryFactory(pathToExcelFile); 
     var getSheet = from a in excelFile.Worksheet(sheetName) select a; 
     string Subject = ""; 
     string Type = ""; 
     string Reading = ""; 

     foreach (var a in getSheet) 
     { 
      if (a["Subject"] == "$" || a["Type"] == "$" || a["Reading"] == "$") // This is where it checks for the "$" sign 
      { 
       if (System.IO.File.Exists(pathToExcelFile)) 
       { 
        System.IO.File.Delete(pathToExcelFile); 
       } 
       TempData["meter_fail"] = "Error! Illegal Characters!"; 
       return RedirectToAction("MeterManager"); 
      } 
      else 
      { 
       Subject = a["Subject"]; 
       Type = a["Type"]; 
       Reading = a["Reading"]; 
       try 
       { 
        Reading newEntry = new Reading(); 
        newEntry.title = Subject; 
        newEntry.type = Type; 
        newEntry.reading1 = Reading; 
        rentdb.Readings.Add(newEntry); 
       } 
       catch 
       { 
        if (System.IO.File.Exists(pathToExcelFile)) 
        { 
         System.IO.File.Delete(pathToExcelFile); 
        } 
        TempData["meter_fail"] = "Error! Upload Failed!"; 
        return RedirectToAction("MeterManager"); 
       } 
      } 
     } 
     rentdb.SaveChanges(); 
     if (System.IO.File.Exists(pathToExcelFile)) 
     { 
      System.IO.File.Delete(pathToExcelFile); 
     } 
     TempData["meter_success"] = "Reading(s) uploaded successfully!"; 
     return RedirectToAction("MeterManager"); 
    } 

Как я могу проверить для нескольких недопустимых символов, которые могут быть представлены в виде одного или с другими персонажами в клетке? Нужна эта помощь плохо! Благодарю.

+2

До тех пор, пока вы используете параметризованные запросы, которые не должны дезинфицировать файл против шила инъекции. –

+0

Спасибо, но я не понял. Пожалуйста, объясните подробности. –

+0

Awl. Хах. Скошенный автокоррект. Предполагалось, что он будет sql. –

ответ

1

Как указано в @Sam Axe, лучший способ избежать атак на SQL-инъекцию - это параметризация ваших запросов. Параметры являются заполнителями для значений вместо использования пользовательских значений ввода.

Например:

using (SqlConnection conn = new SqlConnection(NorthwindConnectionString)) 
{ 
    string query = "SELECT * FROM Products WHERE ProductID = @Id"; 
    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.Parameters.AddWithValue("@Id", Request.QueryString["Id"]); 
    conn.Open(); 
    using (SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
     DetailsView1.DataSource = rdr; 
     DetailsView1.DataBind(); 
    } 
} 

Вот некоторое дальнейшее чтение на нем: https://msdn.microsoft.com/library/bb738521(v=vs.100).aspx

+0

Спасибо, но я использую 'EF 6', любой шанс, что я могу сделать это с EF? –

+0

Я лично этого не делал, но похоже, что это можно сделать и там. Вот статья, где это делается: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an- MVC-веб-приложение – Ageonix

Смежные вопросы