Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 16201|Yanıt: 0

[ASP.NET] Anti-SQL enjeksiyonunun ASP.NET

[Bağlantıyı kopyala]
Yayınlandı 17.04.2015 13:06:50 | | |

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.

  1. 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ı




Önceki:Metin kutusu yalnızca sayıların girilmesine izin verir
Önümüzdeki:asp.net Metin Düzenleyici (FCKeditor)
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com