ASP.NET Security Yazı Dizisi - 1

ASP.NET Security Yazı Dizisi - 1

ASP.NET ile SQL Enjeksiyondan korunmak...

Bilindiği üzere güvenlik her şeyin başında gelmelidir. Sistemimizi kodlarken her şeyin yolunda gitmesi bizim içimizin rahat olmasını sağlar fakat her zaman yazdığımız kodun doğru çalışması yeterli olmuyor. 

Vereceğim örneği sistemimiz üzerindeki giriş sayfalarında yaptığımız olayın mantığından bahsederek açıklayayım. 

Giriş sayfalarındaki en basit mantık 2 adet textbox girişi (genellikle birisi kullanıcı adı diğeri de şifre için kullanılır), 1 tane de sayfanın post edilmesi için bir butondur. Kodlama mantığı ise; textbox’lara girilen değerlerin buton’a basıldıktan sonra dinamik bir Sql sorgusu ve herhangi bir veri okuma yöntemiyle {genellikle bu iş için DataReader -MSSQL için SqlDataReader daha uygundur- kullanılır } kullandığımız veritabanı üzerindeki verilerle eşleştirilip sistemde sadece kullanıcıların görebileceği alana geçiş yapılır. Buraya kadar her şey mantığa uygun ve sorun yok. Veritabanında kayıtlı olan kullanıcı bu şekilde giriş yapabiliyor. Peki ya bu durumun istismarı söz konusu olursa o zaman ne yapacağız? İlk önce bu sorunun cevabı için bu durumun nasıl istismar edilebileceğini açıklamak gerekir. Bunu örnek vererek açıklayayım. 

Varsayımlarımızdan bahsetmek gerekirse; 

1- Kullanıcı Adı girişimizin yapıldığı textbox’ın id değeri txtKullaniciAdi,

2- Şifre girişimizin yapıldığı textbox’ın id değeri txtSifre,

3- Veritabanımızın adı CyberSecurity,

4- Veritabanımızda kullanıcılarınızın verilerinin saklandığı tablo adı uyeler

5- Veritabanımızda uyeler adlı tablo içerisinde kullanıcı isimlerinin saklandığı kolon adı kullanici_adi

6- Veritabanımızda uyeler adlı tablo içerisinde kullanıcı şifrelerinin saklandığı kolon adı sifre

7- Dinamik Sql sorgumuzun "Select * from uyeler where kullanici_adi = ’" + txtKullaniciAdi.Text + "’ and sifre = ’" + txtSifre.Text + "’ " şeklinde olduğunu varsayalım.

Şimdi de yukarıdaki varsayımlara uygun bir sistemde bu durumun nasıl istismar edildiğine geçelim.

Buraya kadar düzgün bir şekilde işleyen sistemimize ufak bir deneme yapalım. Kullanıcı Adı girişine aşağıda belirttiğim ifadeyi girelim bakalım ne olacak ?

’or 1=1--

Bu şekilde bir giriş yaptığımızda doğacak sonuçları açıklayalım.

Kullanıcı Adı alanına bu giriş yapıldığı taktirde dinamik olarak kullandığımız Sql sorgumuz şu şekli alacaktır.

"Select * from uyeler where kullanici_adi = ’’or 1=1--’ and sifre = ’" + txtSifre.Text + "’ "

Sorgumuz bu hale geldikten sonra bir sifre yazmaya gerek kalmadan sisteme giriş yapılabilir.

Aslında sorgumuzun çalışan kısmı yukarıda belirttiğim kadar bile değil.

Sorgumuz "Select * from uyeler where kullanici_adi = ’’or 1=1--’ şeklini alıyor. Neden diye soranlar için açıklayayım.

’or 1=1-- ifadesinin sonunda bulunan -- işaretleri, buradan sonra gelen sorguyu yok saymak anlamına geliyor.

Peki neden ’or 1=1-- yazdık? Burada verimiz "veya 1=1 eşitliğini sağla" anlamına geliyor. Bu da bizim oraya girdiğimiz değerin hatasız çalışmasını sağlayacaktır.

Bundan nasıl korunuruz?

İlk yapmamız gereken textbox’lara girilen değerlerin kontrolünü yapmak olacaktır. Girilen değerler sadece bizim izin verdiğimiz değerler olmalıdır. Aslında bu iş için aklımda çok farklı bir yöntem daha var fakat yoğunluktan dolayı üzerinde çalışma fırsatı bulamadım. Eğer işe yararsa aklımdaki yöntemi de en kısa zamanda sizlere açıklayacağım. Giriş yapılacak alanların değerlerini dinamik bir şekilde vermekle ilgili bir şeyler düşündüm ama ne derece etkili olacağı hakkında şu an için bir fikrim yok.

Textbox’lara girilen değerleri nasıl kontrol edeceğiz?

Tabii ki RegularExpressionValidator nesnesi ile yapacağız bu işlemi.RegularExpressionValidator nesnesi üzerinde yapmamız gereken tek şey ValidationExpression özelliğine girişine izin vereceğimiz karakter aralıklarını belirtmektir.Örnek vermek gerekirse bu özelliğe atadığımız değerler "^([a-z]|[A-Z]|[0-9]){3,15}$" şeklinde olduğunda textbox’a girilen değerler a-z, A-Z, 0-9 aralığındaki değerler olacaktır.Atanan değerde belirttiğim {3,15} ise textbox’a girilen karakter sayısı ile ilgilidir.Özelliğini bu şekilde atadığımız textbox’a 4 karakterden küçük, 15 karakterden büyük değer giremeyiz.Girdiğimiz taktirde ErrorMessage özelliğine atayacağımız değer ekrana yansıyacaktır ve post işlemi yapılmayacaktır.

Bu yazımın sonuna gelmiş bulunmaktayım. Güvenlik yazılarım seri halinde devam edecektir. Sadece bu yazımdakiler güvenliğimiz için tek başına yeterli olmayacaktır. Bunun yanında yapmanız gerekenleri de diğer yazılarımda anlatacağım. Mesela bu yazıda dinamik Sql cümleleri yerine stored procedure kullanmayı anlatmadım yada ConnectionString güvenliğini anlatmadım. Şimdilik bu kadar. Bunları özümsedikten sonra diğer yazılarımı okumanızı tavsiye ederim. Her şey sırasıyla olursa istediğiniz bilgiyi daha kesin bir şekilde öğrenebilirsiniz.

Yazan: Doğukan DEMİR

Döküman Arama

Başlık :

Kapat