SQL İnjection Saldırılarını Önleme Ve İpuçları

Sql Injection hangi sistem olursa olsun güvenlik için önemli bir tehdittir. Özellikle kişisel bilgilerin saklandığı ortamlar için güvenlik üst düzeyde olmalıdır.

SQL İnjection

Sistemlerin güvenlik seviyelerini geliştirmek için farklı yaklaşımlar vardır. Sql Injection, veritabanı ile kurulan bağlantıları herhangi bir uygulama tarafından tetiklenebilen yaygın saldırı biçinlerinden birisidir.

Aşağıda Sql Injection saldırılarına karşı veri güvenliğini sağlamak için çeşiktli örnekler bulunmaktadır.

Sql Injection Nedir ?

Sql Injection bir veritabanına istenmeyen Sql ifadeleri çalıştırmak için kullanılan bir tekniktir. Bu istenmeyen ifadelerin Sql deyimi şablonları ile birleştirilmesi için kullanıcı giriş izinlerinden yararlanılır.

Bir saldırgan, bir saldırıyı başlatmadan önce uygulama deliklerini bilmesi gerekir. Yazının geri kalından SQL Injection saldırı türleri, örnekler ve bunu önlemek için gerekli teknikler bulunmakta.

Sql Injection Örneği

Saldırgan bir giriş alanına bağlı zararlı ifadeler ile veritabanına ulaşır ve hemen yanıt alır. Uygulama giriş ve çıkışı doğrulanmadan, son kullanıcılara mesaj döndürüldüğü güvenliğin en düşük seviyede olduğu saldırı türüdür.

Kullanıcının sorgu parametresi olarak (id) değerine dayalı ürün ayrıntılarını görüntülemeyi sağlayan bir Url ile web uygulaması var sayalım.

http://www.ornek.com/urun/detay.aspx?id=100

Veritabanından ürün bilgilerini almak için aşağıdaki kod parçacığı kullanılıyor.

String id = Request.QueryString["id"];
String query = "SELECT * FROM tblUrunler WHERE urunid= {0}";
String sqlQuery = String.Format(query, strID);
DataTable dtUrunler = new DataTable();

SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, new SqlConnection("connection string"));

adapter.Fill(dtUrunler);

urunListView.DataSource = dtUrunler;
urunListView.DataBind();

İlk satırda, sorgu dizesinde bulunan (id) değeri doğrudan kullanıcıdan sağlanan değer şeklinde bir değişkene atanır. Uygulamada (id) değerini bir tamsayı olarak girilmesi beklenmekte.

http://www.ornek.com/urun/detay.aspx?id=100 or 1=1 “or 1=1” her zaman doğrudur anlamına geldiğinden tablodaki tüm satırları döndürür. Bu url yapısı sayesinde, oluşturulan Sql sorgusu aşağıdaki şekilde görünecektir.

select * from tblUrunler where urunid=100 or 1=1

Yukarıda yapılan örneği çalıştırdığımızda tblUrunler tablosunun tüm satırları kullanıcıya döner ve gösterilir. Kullanıcı giriş kontrolü yapılmayan bir parametre giriş alanına daha farklı Sql ifadeleri kullanarak kötü sonuçlara neden olabilir.

http://www.ornek.com/urun/detay.aspx?id=100;delete from tblUrunler Kullanıcı kontrolsüz bir giriş alanı ile tüm tablodaki verileri silebilir.

Aşağıdaki kod parçasında da bu girilen parametrelerin nasıl kontol edileceğini görebiliriz.

        String id = Request.QueryString["id"];

	/********Giriş Kontrolü********/
	if (String.IsNullOrEmpty(id)) return;
	if (!IsNumeric(id)) return;

	/****Stored Procedure ve Parametreli Sorgu Kullanımı****/
	SqlConnection sqlConnection = new SqlConnection("Connection String");
	SqlCommand sqlCommand = new SqlCommand("sp_getUrunler", sqlConnection);
	sqlCommand.CommandType = CommandType.StoredProcedure;

	SqlParameter sqlParameter = sqlCommand.Parameters.Add("@urunid", SqlDbType.Int);

	sqlConnection.Open();

	urunListView.DataSource = sqlCommand.ExecuteReader();
	urunListView.DataBind();

	sqlConnection.Close();

SQL Injection Saldırıları Önlemek için İpuçları

1- Cookie değerleri dahil olmak üzere tüm kullanıcı girişleri için güçlü bir sunucu taraflı doğrulama uygulayın.
2- Kullanıcı girdilerinde özel karakterlerden kaçın veya filtreleme yapın.
3- Mümkün olduğunca stored procedure kullanın.
4- Parametreli sorgu veya ORM kullanın.
5- Sql Server exec komutunu kullanmaktan kaçının.
6- Uygulama içinden veritabanına bağlanmak için sa kullanıcısını kullanmaktan kaçının. Sorguları çalıştırmak için düşük özellikli bir hesap kullanmaya dikkat edin.

PaylaşShare on Facebook6Tweet about this on TwitterShare on Google+0Pin on Pinterest0Share on Tumblr0Share on LinkedIn0Email this to someone

Yazar Hakkında Yazarın Bütün Yazıları Yazarın Web Sitesi

Mertcan Kibar

2 YorumYorum Yazmak İçin

  • İyi Günler Ben web sitemde Admin panelini koymadan makalelerimi ekliyorum..Acaba yine de SQL injection yapılabilir mi….

    • Ön yüzdeki makale detay sayfasında querystring ile id değeri gönderiyor iseniz burada mutlaka kontrol koymanız gerekiyor. Sql Injection sadece input alanlardan değil querystring gibi parametre alanlarında da denenebilir.

Bir Cevap Yazın

Your email address will not be published. Required fields are marked *

*