1. SQL enjeksiyonu nedir? Sözde SQL enjeksiyonu, form formuna SQL komutları ekleyerek alan adı veya sayfa talebinin sorgu dizesini göndermek veya girmek ve sonunda sunucuyu bazı zararlı SQL komutlarını çalıştırmaya kandırmaktır. Akıllı SQL ifadeleri oluşturmak için parametreler göndererek, istenen veriyi başarıyla elde edebilirsiniz.
2. SQL enjeksiyon türü Özellikle, SQL enjeksiyonu beş kategoriye ayrılabilir: sayı enjeksiyonu, karakter enjeksiyonu, arama enjeksiyonu (like), enjeksiyon ve cümle bağlantısı enjeksiyonu. Uygulama açısından, IP'de SQL enjeksiyonu, arama, toplu silme ve veritabanından veritabanına aktarmaya özel dikkat gösterilmelidir.
3. Nasıl enjekte edilir
Tipik bir örneme bakalım
SqlCommand cmd = yeni SqlCommand ("SELECT * FROM PE_USERS WHERE UserName = '" 2+ UserName + "' AND UserPassword = '" + PassWord + "'", conn); UserName ve PassWord için doğrulama olmadığından, eğer UserName="admin' OR 1=1--" Yürütülen SQL ifadesi şöyle olur:
SEÇ * FROM PE_USERS WHERE UserName='admin' OR 1=1—' VE UserPassword='' Bu SQL enjeksiyonuna yol açıyor ve şartlar her zaman geçerli, böylece şifre olmadan başarılı bir şekilde giriş yapabilirsiniz.
4. SQL enjeksiyonunu nasıl önlerim
1. Şüpheli dizeleri filtreleyin veya dönüştürün
SQL enjeksiyonu, tehlikeli dizeleri filtreleyen veya dönüştüren fonksiyonlar yazılıp, ardından GLOBAL.ASAX kullanılarak veya bağlam örneklerini yeniden yazarak önlenir
İşte bir örnek
public static bool SqlFilter2(string InText) 2 { 3 dize word="ve|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5 yanlış; 6 foreach (kelimede i dizi). Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10 doğru döner; 11 } 12 } 13 yanlış sonuç veriyor; 14 }
2. Global.asax
protected void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Post parametrelerini dolaşır, gizli alan alanları hariç 4 foreach (string i buna. Request.Form) 5 { 6 if(i=="__VIEWSTATE")devam eder; 7 bu.goErr(bu. Request.Form.ToString()); 8 } 9 // Get parametresini geç. 10 foreach (ipi i. Request.QueryString) 11 { 12 bu.goErr(bu. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 if (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 bu. Response.end() 5 } Artılar: Bu özellik, çoğu yeni başlayan programcı tarafından SQL enjeksiyonunu önlemek için kullanılır ve çoğu durumda enjeksiyonu önlemek için iyi çalıştığı anlaşılıyor.
Dezavantajlar: 1. Başlangıçta enjeksiyon için kullanılmayan bazı karakterleri filtreler, bu da beklenmedik sorunlara yol açar. Örneğin, bir forum üyesinin adı filtrelenen karakterlerle aynı karakterleri içeriyorsa, beklenmedik sorunlar ve sorunlar ortaya çıkar.
2. Her seferinde filtreleme veya dönüştürme gereklidir, bu da programın verimliliğini azaltır
2. Parametrik sorgular için depolanmış prosedürler kullanın
SQL enjeksiyonunun ana amacı, kötü amaçlı SQL kodu göndererek veritabanında kötü niyetli komutlar çalıştırmaktır. Bu nedenle, SQL komutları yürütülmeden önce işlendiği sürece, SQL enjeksiyonu etkili bir şekilde önlenebilir. Parametrizlenmiş sorgular, SQL enjeksiyonunu etkili bir şekilde engelleyebilir.
Örnek
const string strSql = "SEÇ * FROM [PE_Users] WHERE UserName = @UserName"; Parametreler parms = yeni Parametreler("@UserName", DbType.String, userName); Yukarıda @UserName bir parametre vardır; Prarmeter nesnesi kullanılarak parametre Komut nesnesine eklenir, Bu size parametreli bir sorgu verir. Yukarıda açıklandığı gibi, ADO.NET SQL Server'a aşağıdaki SQL ifadesini gönderir:
Exec sp_executesql N '[pe_users] içinden * seç, burada username=@username ',N '@username nvarchar(20) ',@username=N 'isim' SQL Server, sorgu çalıştırmadan önce @username "name" dizesini koyar. Aşağıdaki girdileriniz varsa diyelim:
'Union select @@version,null,null— Oluşturulan SQL ifadesi şöyle görünüyor:
Exec sp_executesql N '[pe_users] içinden * seç, burada username=@username ',N '@username nvarchar(20) ',@username=N ''' birlik select @@version,null,null--' Görebilirsiniz ki ADO.NET girdiden kaçıyor.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Kopya kodu
DbTye veya SqlDbType çeşitli veri türleri olabilir. Veri tipinize göre seçim yapabilirsiniz. Bazı yerlerde, parametrenin uzunluğunu belirtmek için de kullanılabilir: int size. Bu aynı zamanda veritabanı taşmasını ve SQL notlarını etkili bir şekilde önler. Girme olasılığı. Artılar: SQL enjeksiyonunu etkili bir şekilde önler. Dezavantajlar: Bazı yerler uygulanamaz, örneğin
3. Beyaz liste
Açıklama: Bazı bilinen parametre aralıkları, SQL enjeksiyonu ve sorgulama işlemlerini engelleyen beyaz listeler şeklinde ele alınabilir Yanlış, örneğin: + sütun adına göre sırala, sütun adı parametre şeklinde iletildiğinde, önce parametreyi değerlendirmek için bir beyaz liste oluşturulabilir numaranın beyaz listede olup olmadığını ve ardından sorgulama, aksi takdirde yanlış işlenecektir. Avantajlar: güvenli ve güvenilir Dezavantajlar: Uygulama yelpazesinin küçük olması |