Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

LINQ to SQL-Veritabanına Dosya Kaydetme ve Okuma

Ocak 13
by Abdurrahman Köken 13. Ocak 2010 14:44

LINQ to SQL , SQL Server’ın varbinary tipini desteklemektedir.Bu sayede veritabana binary olarak dosyalarımızı kaydedebiliriz.Örneğin bir web sitesinde veritabanına kullanıcı profil resimlerininin path’ini  kaydetmek yerine resmi binary olarak kaydedebiliriz.

Veritabanına dosya kaydetme

İlk olarak veritabanımızı oluşturmamız gerekli.Ben kendi veritabanımda Store isimli bir tablo oluşturdum.Tablonun design’ı aşağıdaki gibidir.

Store tablomu tasarladıktan sonra projeme Add New Item diyerek yeni bir LINQ to SQL sınıfı ekliyorum.Daha sonra Server Explorer penceresinden Store tablomu bu sınıfa sürükleyip bırakıyorum.Bu sayfayı kaydedip çıktıktan sonra  sıra geldi dosyamızı veritabanına kaydetmeye.Aşağıdaki kod ile artık dosyamızı veritabanına binary olarak kaydedebiliriz.

NorthWindDataContext ctx = new NorthWindDataContext();

//Store tipinde yeni bir Entity oluşturuyoruz

var stored = new Store();

//Kaydedilecek resmin yolu

string path = @"C:\Users\KullanıcıAdı\Desktop\lf.jpg";

//Kaydedilecek dosyayı byte dizi şeklinde okuyoruz

stored.Binary = File.ReadAllBytes(path);

//Dosyamızın ismini alıp kaydediyoruz

stored.Filename = Path.GetFileName(path);

//Artık oluşturduğumuz entity'yi veritabanına ekliyoruz

ctx.Stores.InsertOnSubmit(stored);

//DataContex'imizde değişiklik olduğu için

//bu değişikliği veritabanına kaydediyoruz

ctx.SubmitChanges(); 

Yukarıdaki kodun gayet açık olduğunu düşünüyorum üstelik her satırın ne iş yaptığını yorum satırlarında da belirttim.İsterseniz bir de kaydettiğimiz bu verileri veritabanından nasıl çekeceğimize bakalım.

Veritabanından binary dosya okuma

Binary olarak kaydettiğimiz verileri diske geri yazmak da kaydetmek kadar kolay.Bunu yaparken ToArray() metodu çok işimize yarayacak:)

string path = @"C:\temp";

var file = p.Stores.First();

File.WriteAllBytes(Path.Combine(path, file.Filename), file.Binary.ToArray());        

Gördüğünüz gibi birkaç satırla  veritabanına kaydettiğimiz binary dosyamızı diske geri yazabiliriz.File sınıfının WriteAllBytes metodunu ve ToArray metodu ile bunu yapabiliriz.Önemli bir nokta veritabanında binary tipinde bir kolon oluşturduğunuzda max 8000 olduğudur.Eğer büyük bir dosya kaydetmeye çalışırsanız “binary data would be truncated” şeklinde bir hata alırsınız.Binary datanın küçültülmesi gerektiği uyarısını veren bu hatayı almamak için önce dosya boyutu kontrolü yapmanızı tavsiye ederim.Kolay gelsin.

  

SQL Injection

Haziran 25
by Abdurrahman Köken 25. Haziran 2009 20:35

Bugün uzun zamandır yazmayı düşünüp de yazmaya vakit bulamadığım bir konuyu paylaşacağım.SQL injection dinamik SQL sorgularında meydana gelebilecek bir açıktır.Bu açık sayesinde veritabanına  yetkili girişi yapılarak sızılabilir.Bu tarz saldırılar genelde kullanıcı girişi kontrollerinde kolayca kullanılabilmektedir.Örnek  SQL injection uygulanabilecek  bir sorgu şu şekildedir.

sorgu = "select * from Users Where Username = '" + xtUserName.Text.Trim() + "' and Password = '" + txtSifre.Text.Trim() + "'";

Formumuzdaki kullanıcı adı alanına şunu yazalım:

'or 5=5 --

Şifre alanına ise ne yazıldığı önemli değildir.Giriş butonuna bastığınızda başarılı bir şekilde oturum açıldığını göreceksiniz.Kullanıcı adı alanına girdiğimiz ifadeden sonra sorgumuzu tekrar inceleyelim bakalım neler olmuş.

select * from Users  where Username=" or 1=1 –-

Sorgumuz bu hale geldi.Burada Username false döner ve 1=1 olduğundan true döner.True ve false or işlemine tabi tutulunca biri doğru olduğundan dolayı true döner.Bu yüzden where koşulumuz true döndürür ve tüm kayıtları getirir.İlk bulduğu kayıt ile giriş yapılmış olur.Peki şifre alanı yazılanlar ne oldu dersiniz?SQL’de -- ifadesi kendisinden sonra yazılanları yorum satırı olarak görür:)Bunu engellemek için optimum çözümlerden biri  SqlCommand nesnesi kullanarak girilen kullanıcı adı ve şifreyi parametre olarak göndermektir.Yukarıdaki örneği şu şekilde yazabiliriz: 

string sorgu = "select * from Users where Username =@user and Password=@pass";

SqlCommand cmd = new SqlCommand(sorgu,conn);

cmd.Parameters.AddWithValue("@user", (string)txtUserName.Text);

cmd.Parameters.AddWithValue("@pass",(string)(txtSifre.Text)); 

SQL injection’ı bu şekilde parametre kullanarak alt alt edebiliriz.Hatta daha da  iyisini yapmak mümkün .Stored Procedure kullanarak hem güvenlik hem performans hem de hız konusun da yüksek başarım sağlayabiliriz.Stored procedure’larla ilgili bilgi için önceden yazmış olduğum makaleye göz atabilirsiniz.

Teşekkürler.

Tags:

Güvenlik | SQL

Stored Procedure ve Yetenekleri

Mayıs 08
by Abdurrahman Köken 8. Mayıs 2009 01:27

Öncelikle stored procedure(saklı yordamlar) hakkında biraz bilgi vermek istiyorum.Saklı yordamlar aslında sql cümlecikleridir.Veritabanı nesnesi oldukları için de veri tabanı yöneticisi programda yer alırlar.Peki neden bu gibi nesnelere ihtiyacımız var faydaları ne diyebilirsiniz.Saklı yordamların faydalarını şu şekilde sıralayabiliriz.Performans,hız,istemci yükünü azaltma,ağ trafiğini azaltma ve tabiî ki de güvenlik.Şimdi veritabanımızda nasıl bir saklı yordam oluşturulabileceğimize gözatalım.Örnek olarak oturum açma ile ilgili bir saklı yordam yazalım.Saklı yordamımızın iki parametresi olsun kullanıcı adı ve girilen şifreyi veritabanımızda oluşturmuş olduğumuz kullanıcıların bilgilerinin tutulduğu Users tablosundan kontrol edip eğer varsa oturum açma işlemini devam ettirmesini sağlayabiliriz.Ben saklı yordamımı oluşutururken sistem tablosu olan master database’ini kullandım.Önce Users adında kullanıcıadı ve şifrelerinin saklandığı tabloyu oluşturdum.Daha sonra master database’imizin altında Programmability’in altında Stored Procedure içinde sistemde bulunan saklı yordamlar bulunur.Üzerinde sağ tıklayıp New Stored Procedure seçeneği ile yeni bir saklı yordam yazacağız.Ben aşağıdaki gibi bir slq sorgusu ile sp_login adında bir saklı yordam oluşturdum.

 

Stored Procedure Oluşturma

Sql sorgumuzu yazdıktan sonra üstteki Execute butonu ile sorgumuzu çalıştırıyoruz.Stored Procedure klasörüne sağ tıklayıp Refresh dediğimizde oluşturmuş olduğumuz saklı yordamı görebiliriz.C#  şu sekilde saklı yordamımızı kullanabiliriz.

  SqlConnection conn = new SqlConnection("bağlantı yolu.");

  SqlCommand cmd = new SqlCommand("sp_login",conn);

  cmd.CommandType = CommandType.StoredProcedure;

  cmd.Parameters.AddWithValue("@kullanici", txtUser.Text);

  cmd.Parameters.AddWithValue("@sifre", txtPass.Text);

    conn.Open();

  SqlDataReader dr=cmd.ExecuteReader();

Gördüğünüz  gibi sp_login saklı yordamımızda parametre olarak oluşturduğumuz @kullanici ve @sifre parametrelerini  SqlCommand nesnemize parametre olarak aktardık.Saklı yordamların güvenlik kısmını  ise bir sonraki yazımda sql injection başlığı altında bahsedeceğim.

 

Abdurrahman Köken-Recent Post