filtre to sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
filtre to sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

1 Nisan 2016 Cuma

Sql injection Savunma Yolları - İnputları Filtrelemek | defense of inputs for SQL injection - Filtre inputs

Sql injection bir forma parametre girerek onu ilgili yere göndererek gerçekleştirilir. Bu gönderme sonucunda veri tabanı ile ilgili işlemler yapılır. Bu işlemlerin amacını girdiğimiz input değerleri ile değiştirebilmekteyiz. Biz geliştiriciler olarak fonksiyonumuzun amacı dışına çıkmasını istemeyiz. Bu yüzden de bu gibi input değerlerini engellemeliyiz. Öncelikle ne gibi inputlar la bizim fonksiyonumuzun amacını değiştirdiklerini bir görelim:

"select * from Admin Where AdminAdi = '" + input1 + "' and ' AdminSifre = '" + input2 + "'"

bu sorgumuzun sonucunda Admin adi ve şifresi ile eşleşen bir veri olursa değerimiz pozitif olacaktır. Eşleşme olmazsa değerimiz null olarak dönecektir. Bu sorguyu kötü niyetli kişiler istediği gibi girebilebilir. Mesela admin adı için girilen input 1 değeri

1' or '1' = '1'"-- olursa şöyle bir tablo ortaya çıkacaktır.

"select * from Admin Where AdminAdi = '1' or '1' = '1'"--' and ' AdminSifre = '" + input2 + "'

bu sorgu sonucu pozitif olarak dönecektir. Çünkü 1=1 sorgusu sayesinde sorgunun değeri 1 olacaktır ve AdminSifre bilgisi yorum satırı olarak görülecektir. Bu gibi açıklıklar için savunma yollarını konuşalım.

Örneklerimi C# üzerinden vereceğim fakat bu fikirleri kullanarak istediğiniz dilde sizde oluşturabilirsiniz.

1- Öncelikle bu örneğimizin önüne geçecek bir filtre oluşturalım.

            public static string Temizle(string Metin)
        {
            string deger = Metin;
            try {
            deger = deger.Replace("'", "");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            }catch(Exception e) { }
            return deger;
        } 

 bu fonksiyonumuzu kullanarak özel işaretlerin silinmesini engelleyebiliriz. Böylece kötü niyetli kişiler sorgumuzun amacını değiştiremez.

2- İnput değerimizin sadece sayı olarak girilmesini istiyorsak;

        public static string sayikontrol(string Text)
        {
            try
            {
                int x = Convert.ToInt32(Text);
            }
            catch
            {
                Text = "0";
            }

            return Text;
        }


kullanabiliriz. Böylece sayı olarak girilmeyen karakterlerin engellenmesini sağlamış oluruz.

3- Url adresini input olarak alır isek şöyle bir filtre uygulayabiliriz.

        public static string UrlSeo(string Metin)
        {
            string deger = Metin;
            deger = deger.Replace("'", "");
            deger = deger.Replace(" ", "_");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            deger = deger.Replace("ı", "i");
            deger = deger.Replace("ö", "o");
            deger = deger.Replace("ü", "u");
            deger = deger.Replace("ş", "s");
            deger = deger.Replace("ç", "c");
            deger = deger.Replace("ğ", "g");
            deger = deger.Replace("İ", "i");
            deger = deger.Replace("Ö", "o");
            deger = deger.Replace("Ü", "u");
            deger = deger.Replace("Ş", "s");
            deger = deger.Replace("Ç", "c");
            deger = deger.Replace("Ğ", "g");

            return deger;
        }

böylece türkçe karakterler ve bazı özel karakterlerin kullanılmasını engelleyebiliriz.

4- İnputlarımız için validator(doğrulayıcı) kullanımı oldukça iş görmektedir.  Bunun için ilgili makalelerde arama yapabilirsiniz. Size bu konuyu bir örnekle kısaca açıklayayım.

<td class="style2">
    <asp:TextBox ID="txtemail" runat="server">
    </asp:TextBox>
 </td>

 <td>
    <asp:RegularExpressionValidator ID="remail" runat="server"
       ControlToValidate="txtemail" ErrorMessage="Mail adresini gir"
       ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
    </asp:RegularExpressionValidator>
 </td>


burada email adresinde farklı karakterler olması durumunda input değerini kabul etmeyecektir ve ekrana ilgili hatayı bastıracaktır.

5- Url de görülen get metodu ile aldığımız bazı veriler bizim savunmasız kalmamıza neden olabilmektedir. Örneğin:

http://savunmasizsite.com/index.asp?id=1; SHUTDOWN WİTH NOWAIT;

parametresini girerek idnin yanındaki noktalı virgül ile sql cümlesini tamamlar ve yanındaki diğer komut cümlesi ile sql veritabanınızın servis hizmetini durdurabilir. Bu durumda bizim savunmamız burada gelen parametrenin belli uzunlukta olması gerektiğidir. Parametre uzunluğunu kısıtlarsak buradaki sorgu amacına ulaşmayacak ve veritabanımız hizmeti sağlamaya devam edecektir.

6- C#' ta sql sorugu için daha güvenilir bir kullanım mevcuttur. Sql sorgusunda parametre kullanılmalıdır. Yani;

string cmdStr = "SELECT * FROM Users WHERE UserName=@UserName AND Password=@Password";
SqlCommand cmd = new SqlCommand(cmdStr, sqlConnection);
cmd.Parameters.Add("@UserName",SqlDbType.NVarChar,50);
cmd.Parameters.Add("@Password",SqlDbType.NVarChar,50);
// İlk veri girişi
cmd.Parameters["@UserName"].Value="Burak";
cmd.Parameters["@Password"].Value="Burak12041976";
cmd.ExecuteNonQuery();


Bu sayede gelen parametreler tek tırnaktan bağımsız çalışacaktır ve hız açısından da bu kullanım önerilmektedir. Görüldüğü gibi gelen parametre tipleride belirlenmiş oldu. Veri tipleri farklı olursa bir engelleme söz konusu olacaktır.



Zamanla başka savunma yöntemlerimi sizinle bu yazımda tekrar paylaşacağım. Tekrar görüşmek üzere.