2016-03-23 30 views
1

yöntemini kullanarak geçirme Parametrelerle kayıt eklemek için bir yöntem oluşturdum, ancak bunu yaparken SQL enjeksiyonundan güvenlik engelliyorsam% 100 emin değilim?sql enjeksiyonu

Sorguyu ayırır ve bu şekilde yeniden takarsak, sql enjekte edilebilir mi? Bu yöntemi

string InsertWithParameters(string tbl, string col, string val) 
    { 
     string cnString = "connectionstring"; 
     string sqlParameters = col.Replace(",", ",@"); 
     sqlParameters = "@" + sqlParameters; //add the first @ 

     List<string> columns = col.Split(',').ToList<string>(); 
     List<string> values = val.Split(',').ToList<string>(); 
     List<string> paramenters = sqlParameters.Split(',').ToList<string>(); 


     string sql = "insert into " + tbl + " (" + col + ") values (" + sqlParameters + ")"; 

     try 
     { 
      MySqlConnection cnn = new MySqlConnection(cnString); 
      cnn.Open(); 
      MySqlCommand cmd = cnn.CreateCommand(); 
      cmd.CommandText = sql; 
      for (int i = 0; i <= columns.Count - 1; i++) 
      { 
       cmd.Parameters.AddWithValue(paramenters[i], values[i]); 
      } 

      cmd.ExecuteNonQuery(); 
      cnn.Close(); 

     } 
     catch (Exception) 
     { 
      throw; 
      // TODO: Error Log 
     } 

     return ("Record Inserted"); 
    } 
+0

SQL dizgilerini birleştiriyorsanız, yalnızca güvenliğinizi bozduğunuzu varsayın. Asla, asla, asla, asla, asla, asla, asla, asla, asla, asla, asla, asla, asla yapmayın. Bir evde değil, farede değil, bir ruhla değil. Sadece oraya gitme. –

+1

Neden sütun ve parametrelerinizi virgülle ayrılmış bir liste olarak, dönüştürme sorunları vb. Ile birlikte geçirdiniz? Sadece sütun isimleri ve değerler için bir dizi nesne için bir dizi dizelerden geçirin. Bölme gerektirmez vb ... –

+0

@Ed, SQL dizgilerini birleştirmek için tavsiye edilmeyebilirken, bu özel durumda şu ana kadar söyleyebileceğim şeyden, SQL dizgisi sadece sabit kodlanmış değerlerden bir araya getirilmiştir. SQL, aramadan önce kodlanmış bir dizeden kaynaklanan col parametresinden kaynaklanan dizelerle doldurulur). SQL enjeksiyonunun herhangi bir yolunu göremiyorum ... ama ;-) – Christoph

cevap

0

Bu enjeksiyon güvenli Eğer string tbl tam olarak kontrol müddetçe ve string col 'ın değerleri kullanarak

string tbl = "tbl_jobLogs"; 
string col = "job,user,logDate,log,logType" ; //,logType"; 
string val = jobID.ToString() + "," + user.ToString() + "," + dt.ToString("yyyy-MM-dd H:mm:ss") + "," + log + "," + logType.ToString() ; 

MessageBox.Show(InsertWithParameters(tbl,col,val)); 

bu çünkü iki dizeleri hangi herhangi eklemek RDBMS'ye gönderilen SQL dizesine parçalar.

Bu uygulamayı çevreliyorum ve virgülle ayrılmış bir sütun listesi iletmek yerine ayrı sütun değerlerinden oluşan bir koleksiyon geçiriyorum. Bunun sebebi, bir ipi yeniden birleştirmekten ziyade bir ipi tekrar monte etmenin daha kolay olmasıdır. Örneğin, bir dizeyi ayrıştırma yönteminiz, virgül içeren sınırlandırılmış tanımlayıcılara sahip tablolar için kesilir.

Bu *

SELECT [Return, Raw], [Return, Normalized] FROM Returns 

Yöntemin çünkü gömülü virgül nedeniyle başarısız olacak bir derece yasal sorgu olduğunu. yerine tanımlayıcıları dizisi geçmesine, kolayca bu gibi virgülle ayrılmış listesini yeniden inşa edebileceğine: Ben illa böyle adlarını kullanarak tavsiye etmem rağmen, mevcut veri tabanları ile çalışmanız gerekebilir

string[] colNames = new[] {"[Return, Raw]", "[Return, Normalized]"}; 
var col = string.Join(", ", colNames); 

* Bu size bir seçenek bırakmıyor.

+0

Katılıyorum. InsertWithParameters yöntemi kendi başına enjeksiyon güvenliği değildir, sadece gösterilen iki yöntemin kombinasyonu. Birisi tbl parametresini değiştirebilseydi, böyle bir şeye geçebilirlerdi: "hesaplar (kullanıcı adı, rol, şifre) değerleri ('hacker', 'süperadmin', '1234'); tbl_jobLogs içine eklenir". Ve kötülük yapanların yeni bir kullanıcı hesabı enjekte ettiğini gördük. – Christoph

+0

@dasblinkenlight Mükemmel nokta, olasılık olduğunu düşünmedim bile. Teşekkürler. –

İlgili konular