YazılımMimarı
Forum Ustası
Selamlar,
Parametrik(Parameterized) olarak sql sorgularımızı çalıştırmamızın en büyük nedeni, oluşabilecek sql injection'ları önlemektir.
Spagetti kod yazanlar genelde,
Update tablo set username = "'+Text1.Text'" where Id =" + Id; benzeri sql cümleleri string concat ile yaparlar, Strign concat'ler her daim dışarıdan manipuple edilebilir. Ne bileyim, eğer bir hata sayfanız yoksa Id değeriniz int yada long bir değerse adam Id değerini "ahmet" gibi string bir değer gönderdiğinde haşırt diye bir exception basar .net bu exception gelende connection provider'ı bir kısmını gösterir tabi alınacak bu exception'ın üstesinden gelmediyseniz yada default bir hata sayfanız yoksa basta belirttiğim gibi..
Diğer bir sebebi ise number ve string değerler için tırnaklar önemlidir.. SQL'i çalıştığınızda bir hata atar, sonra arada bul teker teker data tiplerini kontrol et, tırnaklar doğrumu filan feşman gibi zaman kaybettirici saçmalıklarla uğraşmak yerine ;
Aşağıdaki gibi oluşturduğum GIST'te parametreleri kontrol edip, parametrik olarak sql'imize verebiliriz.. Bu bizi zaman kaybından ve sql injection'dan kurtarır ..
Kaynak GIST'im : https://gist.github.com/TurgayCan2/2d89a688560bdf6f6198
Parametrik(Parameterized) olarak sql sorgularımızı çalıştırmamızın en büyük nedeni, oluşabilecek sql injection'ları önlemektir.
Spagetti kod yazanlar genelde,
Update tablo set username = "'+Text1.Text'" where Id =" + Id; benzeri sql cümleleri string concat ile yaparlar, Strign concat'ler her daim dışarıdan manipuple edilebilir. Ne bileyim, eğer bir hata sayfanız yoksa Id değeriniz int yada long bir değerse adam Id değerini "ahmet" gibi string bir değer gönderdiğinde haşırt diye bir exception basar .net bu exception gelende connection provider'ı bir kısmını gösterir tabi alınacak bu exception'ın üstesinden gelmediyseniz yada default bir hata sayfanız yoksa basta belirttiğim gibi..
Diğer bir sebebi ise number ve string değerler için tırnaklar önemlidir.. SQL'i çalıştığınızda bir hata atar, sonra arada bul teker teker data tiplerini kontrol et, tırnaklar doğrumu filan feşman gibi zaman kaybettirici saçmalıklarla uğraşmak yerine ;
Aşağıdaki gibi oluşturduğum GIST'te parametreleri kontrol edip, parametrik olarak sql'imize verebiliriz.. Bu bizi zaman kaybından ve sql injection'dan kurtarır ..
Kod:
private static string connString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI"; //kendinize göre düzenleyin
private boolean checkNullForString(String val){
return val == null && val.Trim() == "";
}
public void save(){
String CihazAd = textBox1.Text;
if( checkNullForString(cihazAd)){
//Uyarı mesajı bas
return;
}
String CihazModel = textBox2.Text;
if( checkNullForString(cihazModel)){
//Uyarı mesajı bas
return;
}
String CihazSeriNo = textBox2.Text;
if( checkNullForString(cihazSeriNo)){
//Uyarı mesajı bas
return;
}
String AlanBirimAdi = textBox4.Text;
if( checkNullForString(alanBirimAdi)){
//Uyarı mesajı bas
return;
}
String BiriminAldigiTarih = dateTimePicker1.Text ;
if( checkNullForString(biriminAldigiTarih)){
//Uyarı mesajı bas
return;
}
using (SqlConnection dbConn = new SqlConnection(connString))
{
dbConn.Open();
using (SqlTransaction dbTrans = dbConn.BeginTransaction())
{
try
{
using (SqlCommand dbCommand = new SqlCommand("UPDATE Cihazlar SET CihazAdi=@CihazAdi, CihazModeli=@CihazModeli, CihazSeriNo=@CihazSeriNo, AlanBirimAdi=@AlanBirimAdi, BiriminAldigiTarih=@BiriminAldigiTarih WHERE Id=@Id );", dbConn))
{
dbCommand.Transaction = dbTrans;
dbCommand.Parameters.Add("Id", SqlType.VarChar).Value = Id;
dbCommand.Parameters.Add("CihazAdi", SqlType.VarChar).Value = CihazAd;
dbCommand.Parameters.Add("CihazModeli", SqlType.VarChar).Value = CihazModel;
dbCommand.Parameters.Add("CihazSeriNo", SqlType.VarChar).Value = CihazSeriNo;
dbCommand.Parameters.Add("AlanBirimAdi", SqlType.VarChar).Value = AlanBirimAdi;
dbCommand.Parameters.Add("BiriminAldigiTarih", SqlType.VarChar).Value = BiriminAldigiTarih;
dbCommand.ExecuteNonQuery();
}
dbTrans.Commit();
MessageBox.Show("Güncelleme İşlemi Tamamlandı !", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SqlException)
{
dbTrans.Rollback();
throw;
}
}
dbConn.Close();
}