İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

MsSql de bu kodlarla injeksiyon yer miyim?

hakanizm

0
İyinet Üyesi
Katılım
11 Mayıs 2006
Mesajlar
1,952
Reaction score
1
Konum
Nereye
Bütün sorgularımı aşağıdaki gibi yapıyorum. Yani sanırım stored prosedure kullanmıyorum. Aşağıdaki normal aspx dosyası içerisinde kullandığım komutlar sql injeksiyon açığı mıdır ? Sitemi hekleyebilirler mi ?

PortakalSelect = New SqlCommand("Select Bresim, HaberId, ArsivTarihi, KategoriId, Kategoriler, Yazi, Rate, SUBSTRING(Baslik, 1, 60) as SPORTekBaslikTmp From items WHERE ArsivTarihi=(SELECT ogun FROM online) And KategoriId = 4 ORDER by Baslik", Portakalcon)
 

Mp3Powers.Com

0
İyinet Üyesi
Katılım
27 Nisan 2005
Mesajlar
136
Reaction score
0
KategoriId değerinin dışarıdan querystring ile alındığını varsayalım, doğal olarak adres satırından herhangi bir kullanıcı bu değerin yerine sql sorgunu etkileyebilecek zararlı sözcükleri girebilir ( --, ', drop) gibi.Yapman gereken dışarıdan müdahele edilebilecek ve senin sql sorgunda kullandığın değerleri kontrol ettirmen.

Mesala en basitinden kategoriID sütunun sayısal olduğu için numerik bir değerle karşılaştırma yapıyorsun. Sorgunda bulunan 4 değerinin numerik olup olmadığını kontrol ettirerek işlem yaptırabilirsin.String değerlerde ise database indeki verileri herhangi bir masaüstü yazılımda kullanmayacağını varsayarak söylüyorum, zararlı kodları html karşılıklarına çevirebilirsin.Aşağıdaki örnek ASP fonksiyonu bu işi yapıyor.

Kod:
Function SqlKoruma(strWords)
strBadWords = Array("SELECT", "DROP", "--", "INSERT", "DELETE", "xp_", "UNION", "UPDATE", "'", "’", "<%", "<SCRIPT>", "<META", "<", ">")
strBadWordsReplace = Array("SELECT", "DROP", "--", "INSERT", "DELETE", "xP_", "UNION", "UPDATE", "'", "'", "", "", "", "[", "]")
For iSQL = 0 to uBound(strBadWords)
strWords = Replace(strWords, strBadWords(iSQL), strBadWordsReplace(iSQL),1,-1,1)
Next
SqlKoruma = strWords
End Function

Kolay gelsin ;)
 

hakanizm

0
İyinet Üyesi
Katılım
11 Mayıs 2006
Mesajlar
1,952
Reaction score
1
Konum
Nereye
Teşekkürler. Şimdi benim yukarıda verdiğim kodlar ya da şimdi vereceğim kodlarla sitemi riskli hale getirmiş oluyor muyum olmuyor muyum anlayamadım ?

GelenKatAd = Request.QueryString("KatAd")
GelenKatId = Request.QueryString("KatId")
GelenTarih = Request.QueryString("Tarih")
 

DincerAydogdu

0
İyinet Üyesi
Onaylı Üye
Katılım
15 Nisan 2005
Mesajlar
1,741
Reaction score
29
Konum
Live in .NET
hakanizm. System.Data.SqlClient.SqlParameter kullan. Bu yöntemle asla injection yemezsin.

Örneğin -- ya da ' datası geldiğinde bu gerçekten string olarak -- olarak algılanır.
 

hakanizm

0
İyinet Üyesi
Katılım
11 Mayıs 2006
Mesajlar
1,952
Reaction score
1
Konum
Nereye
Dincer nasıl kullanıcam ? Dediğin şeyi sayfanın en üstüne namespace olarak falan eklemek yetiyor mu ?

Bir arkadaş şöyle demiş.. Çok küçük bi işlemle halledilebiliyormuş..
---
GelenKatId = cint(Request.QueryString("KatId")) bu şekilde önleyebilirsin.
---
 

DincerAydogdu

0
İyinet Üyesi
Onaylı Üye
Katılım
15 Nisan 2005
Mesajlar
1,741
Reaction score
29
Konum
Live in .NET
Senin için ufak bir örnek yazdım. Bir incele istersen.

CInt olayına gelince. Bu tartışılır. Buraya sayısal olmayan bir değer geldiğinde asp.net parse exception atacaktır. Avantajı evet senin işini çözebilir ama bana göre biraz amatörce. Dezavantajı, bu da performans üzerinde gereksiz kayıp demektir (tüm application üzerinde)

Ayrıca teknik olarak bir diğer yanı ise .NET framework kullanırken eski VB komutlarını kullanmayı (CInt bunlardan biridir) bir çok MVP önermiyor ki benim de önerim değildir. Sebebi ise derledikten sonra CLR'i inceledikten sonra çıkıyor. Bu VB komutları worker processor'a fazladan gereksiz işlem yaptırıyorlar. Mesela bu convert işlemi CInt ile değil de Framework yapısında bulunan Integer.Parse ya da Convert.ToInt32 ile yapılsaydı en doğrusu bu olacaktı ki bunlar CLR'de tabiri caizse çok temiz şekilde tutulurlar.

Kod:
Module Module1

    Sub Main()
        Dim PortakalCon As New SqlClient.SqlConnection("Connection string buraya")
        Dim Command As New SqlClient.SqlCommand
        Command.Connection = PortakalCon
        Command.CommandText = "SELECT falan,filan FROM tabloadi WHERE id=@id AND falan=@falan AND filan=@filan"
        Dim par0 As New SqlClient.SqlParameter("@id", 1) 'Buraya Request.QueryString("id") girmende hiçbir sakınca yoktur.
        Dim par1 As New SqlClient.SqlParameter("@falan", "falanca")
        Dim par2 As New SqlClient.SqlParameter("@filan", "filanca")
        Command.Parameters.Clear()
        Command.Parameters.Add(par0)
        Command.Parameters.Add(par1)
        Command.Parameters.Add(par2)
        'Sonrası malum...
    End Sub

End Module
 

hakanizm

0
İyinet Üyesi
Katılım
11 Mayıs 2006
Mesajlar
1,952
Reaction score
1
Konum
Nereye
Sağolasın. cint olayında benim dll oluşturmama sesini çıkarmıyorsa önemli değil. Ama senin verdiğin örnekte queryleri "@" bu parameter olayıyla kullandığım zaman sorun çözülüyorsa parameter kullanayım.. Bir asp.net kitabında @ lu queryleri okumuştum :)
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst