ASP'de Regex ile SQL İnjection Tespit Etme ve Engelleme
Merhaba arkadaşlar ASP'de Regex ile SQL İnjection önlemeyi ve tespit etmeyi anlatacağım.
querystring = Request.ServerVariables("QUERY_STRING") if querystring <> "" then ' URL'deki querystringi aldık(query string url'nin sonunda yer alan, "?"'den sonra gelen "id=3" vb. "degisken=deger" kalıbında bulunan kısmıdır. Eğer url boş değilse yani doluysa: pattern = array("=","&","%","!","#","\?","<",">","\*","/","\",",",";","and","union","select","where","like","from","update","insert","order","group","alter","add","modify","rename",Chr(34),Chr(39)) burada sql injectiona neden olabilecek karakterleri regex'de de ifade edilecebilecek şekilde bir diziye aktardık Set RegExp = New RegExp 'yeni regex nesnemizi oluşturuyoruz RegExp.IgnoreCase = True ' Büyük-küçük harf duyarlılığını kaldırdık RegExp.Global = True ' Tüm eşleşmeleri aramasını sağladık for i = 0 to 28 if i = 0 then desen = pattern(i) else desen = desen&"|"&pattern(i) end if Next Burada ise regex desenimizi oluşturacak döngüyü yazdık. dizide 29 elemanımız var, 0'dan başladığı için 28'e dek bir döngü oluşturduk.. eğer desen değişkenimiz henüz değer almamışsa -ki zaten i=0 iken henüz bir değeri yok- dizimizdeki i indisli elemanı değişkene atıyoruz (bu durumda i=0 olduğu için ilk elemanımızı atamış oluyoruz) ilk elemanı atadıktan sonra regex desenimiz eleman1|eleman2|eleman3 diye devam edeceği için sonraki adımlarda -yani i'nin 0'dan büyük olduğu durumlarda- değişkenimize değişkenin varsayılan değerinin yanında "|" işaretleri ve yeni elemanları ekliyoruz. Sonuç olarak desenimiz "dizielemanı1|dizielemanı2|dizielemanı3|dizielemanı4..." şeklinde olacak.. Regex desenimizde "|" işaretini kullanarak dizimizdeki stringlerden en az birinin url'mizde olup olmadığını sorugulatacağız. RegExp.Pattern = desen 'desen değişkenimizi regex nesnemizin desen niteliğine atadık parcala = split(querystring,"=") ' Burada Querystring'imizi parçalıyoruz.Çünkü bize "="den sonraki yer lazım. Ancak burada sadece parçalamamız yetmez çünkü sadece parçalarsak "id=3+union+select...=..." querystring'inde eşittir'den sonraki kısmı alamayız. Bunun için yine bir döngü yapacağız. querystring'imizdeki ilk "eşittir" işareti(id=...) hariç -bu da dizimizin 0 indisli elemanı olur bu yüzden döngüyü 1'den başlatıyoruz- tüm eşittirlerle beraber ilk "eşittir" işaretinden sonraki querystringimizi alacağız diziboyut = ubound(parcala) for e = 1 to diziboyut if qUrl<>"" then qUrl = qUrl&"="&parcala(e) else qUrl = parcala(e) end if Next sonuc = RegExp.Test(qUrl) 'RegEx desenimizin qUrl değişkenimizde olup olmadığını test ediyoruz ve varsa True yoksa False değer döndürecektir.. if sonuc = True then 'Burada da dönen sonucun doğru olup olmadığını kıyaslıyoruz ve buna göre işlem yaptırıyoruz .. Peki bu işaretleri direk temizlemek istersek ne yapabiliriz? qUrl = Regex.Replace(qUrl,"") Response.Redirect Request.ServerVariables("HTTP_HOST")&Request.ServerVariables("SCRIPT_NAME")&"?"&"querystringdekideğişkeininizinisimi"&"="&qUrl Böylelikle Reqular Expressions(Düzenli ifadeler) yapısıyla URL kaynaklı SQL injection'ı tespit etmiş ve önlemiş olduk.
Hit: 3406
Yazar: Lightsaber