13 Nisan 2008

SQL Sorgusuna Tablo Adını Parametre Olarak Aktarmak

Web uygulamalarında en çok saldırı alabileceğimiz yerler veritabanı üzerinde çalıştırdığımız SQL sorgularımızdır. SQL Injection adı verilen teknik ile kötü niyetli kullanıcılar arka planda çalıştırdığımız SQL sorgularına ek SQL cümleleri ekleyebilmekte ve yeri geldiğinde "DROP DATABASE ..." gibi bir sorgu ile tüm veritabanını bile silebilmektedir! Gerek SQL Server ortamında hazırladığımız stored procedure'larda, gerekse uygulama tarafında kullandığımız ADO.NET nesnelerinde parametre (parameter) kullanarak bu tip tehditlerden veritabanımızı koruyabilmekteyiz. Parametreler SQL cümlelerinde sadece sütunlarda aranacak değerleri taşıyabilmekte, tablo veya sütun isimlerini ise taşıyamamaktadır. "Select * From Haberler Where HaberID=@id" gibi bir SQL cümlesinde HaberID sütununda aranacak değer parametre olarak aktarılabilir. Peki SQL cümlesine tablo adını parametre olarak aktarmak gibi bir durumda nasıl bir yolu izleyebiliriz? Yani "Select * From @TabloIsim" gibi bir SQL cümlesi yazabilsek ve parametre olarak Haberler bilgisini yolladığımızda sorgumuz Haberler tablosundaki, Duyurular bilgisini yolladığımızda da Duyurular tablosundaki tüm verileri getirse...


Tablo adını parametre olarak aktarma şansımız sadece stored procedure kullanma durumunda bulunmaktadır. Tabi ki sp içerisinde standart bir cümle yazmak yerine ufak bir hile ile bu işlemi gerçekleştirebileceğiz. Eğer sp içinde SQL cümlemizi bir değişkende saklayıp, alınan parametre değerini cümlemize eklersek tablo adını cümlemiz içerisine aktarabiliriz. Tabi ki cümle bir değişkende saklandığı için sp içerisinde bu cümleyi çalıştırmak ta gerekecektir. Aşağıda tablo adını parametre olarak alan basit bir stored procedure görülmektedir.

CREATE PROC TabloKayitlar
@tablo_isim nvarchar(30)
AS
BEGIN
   DECLARE @sql_str nvarchar(50)
   SET @sql_str = 'Select * From ' + @tablo_isim
   EXEC(@sql_str)
END

4 yorum:

yagmurunsesi dedi ki...
Bu yorum bir blog yöneticisi tarafından silindi.
Aydın Ünlü dedi ki...

Güzel bir detaya değinmişsiniz teşekkürler :)

Adsız dedi ki...

Merhaba elinize sağlık faydalı bir konuya değinmişsiniz. Ben de gelmişken bir soru sorayım. Sql tablolarımı cache'e çekerek çalışıyorum. Ancak şöyle bir sorun var Stored Procedurelerim sql'e her Update, delete veya insert yaptığımda cacheteki tabloları da güncellemek için cache tablosunu silerek tüm tabloyu yeniden çağırıyor.
Acaba direk update, delete veya insert edilen veriyi tüm cache'i silmeden değiştirmem mümkün mü?
Teşekkürler.

//stored procedure'üm
ALTER PROCEDURE [stp_cities]
AS
SELECT * FROM cities

//eğer boşsa veya sql update edilmişse çağırdığım kod


SqlConnection con = new SqlConnection(connStr);
con.Open();

SqlDataAdapter da;
DataTable dt;

SqlCommand query = new SqlCommand();
query.CommandType = CommandType.StoredProcedure;

query.CommandText = "stp_cities";
query.Connection = connn;
da = new SqlDataAdapter();
da.SelectCommand = query;

dt = new DataTable("cities");
da.Fill(dt);

HttpContext.Current.Cache.Insert("cities", dt, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10));
con.Close();

Esra ŞAHİN dedi ki...

Gerçekten şuan size minnettarım. beni zaman kaybından kurtardınız. Teşekkür ederim:)