A
B
C
Ç
D
E
F
G
Ğ
H
I
İ
J
K
L
M
N
O
P
R
S
Ş
T
U
Ü
V
Y
Z
Q
W
X
+ Ekle
SQL Injection Nasıl Önlenir? Web Güvenliği Nasıl Sağlanır?

SQL Injection Nasıl Önlenir? Web Güvenliği Nasıl Sağlanır?

Editör  : Batuhan TOSUN
Makale İsmi  : Anti-SQL Injection
Makale Düzeyi  : İleri Seviye
Kapsam  : .NET Security
Gerekli Düzey  :  Orta Düzey Programlama Bilgisi

 

Sql injection çoğu kişinin bildiği gibi veritabanına ulaşmak için açıklardan faydalanılarak yapılan bir saldırı methodudur.Bu saldırı biçimi kod yapısında Exploit dediğimiz sistemi sömüren yapının bir türevidir.Asp .Net ile yaptığımız ve veritabanı kullandığımız bir sitede bunu nasıl önleyebiliriz onu göreceğiz.

Direk olarak konuya yane uygulamaya giriyorum.

İlk olarak aklımıza login.aspx sayfasını getirelim.Buraya girip user ve pass girişimizi yaptığımızda sitenin güvenli bölümüne yönlendirir.İşte güvenliği sağlayacağımız alanda burası.Diğer alanlar içinde kısmi güvenliği bu bölümü yazdığımız kodlar aracılığı ile sağlayacağız.

VS.Net te var olan projemizde iki tane component yaratıyorum ve birinin adını hashed.cs birinin adınıda guvenlibaglanti.cs olarak atıyorum.

 

hashed.cs componentinde yaratacağımız ve atayacağımız kod bloğu aşağıdaki gibi olacaktır.

 

using System;

using System.Web.Security;

using System.Security.Cryptography;

namespace Encryption

{

 

public class hashed

{

static public bool ValidatePassword (string password, string saltedHash) {

//tanımlamaların boyutu için karmalama yapıyoruz

string saltString = saltedHash.Substring (saltedHash.Length - 24);



string hash1 = saltedHash.Substring (0, saltedHash.Length - 24);

// Şifrelemeye yardımcı method ekliyoruz

string saltedPassword = password + saltString;

// şifreleme tabanını oluştuyoruz.

string hash2 = FormsAuthentication.HashPasswordForStoringInConfigFile (saltedPassword, "SHA1");

// hash i karıştırıp geri döndürüyoruz.Böylelikle güvenlik varyasyonunuda güçlü kılıyoruz.

return (hash1.CompareTo (hash2) == 0);

}

static public string CreateSaltedPasswordHash (string password) {

// providerlarımızı oluşturuyoruz.

RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider ();
byte[] saltBytes = new byte[16];

csp.GetNonZeroBytes (saltBytes);

string saltString = Convert.ToBase64String (saltBytes);

string saltedPassword = password + saltString; string hash = FormsAuthentication.HashPasswordForStoringInConfigFile
(saltedPassword, "SHA1");

string saltedHash = hash + saltString;

return saltedHash;

}

}

}

 

Şifreleme ve güvenli girişi sağlayacak olan kodumuzu yukarıdaki gibi yarattık.

Şimdi guvenlibaglanti.cs componentimizi yaratıyoruz.Bu componentimizi connectionstring güvenliği için tanımlıyacağız.

 

using System;

using System.Configuration;

using System.Text;

namespace cryption

{

public class Guvenli_Baglanti

{

static public string GetCnxString(string configKey)

{

string strCnx;

try

{

// Şifreli bağlantı dizisini web.config içinde tutuyoruz.

string strEncryptedCnx = ConfigurationSettings.AppSettings[configKey];

// Bağlantı şifreli dizisine çöz.

DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
byte[] dataToDecrypt = Convert.FromBase64String(strEncryptedCnx);

// Opsitonel parametreyi aşağıda boş bırakacağız.

 

strCnx = Encoding.UTF8.GetString(dp.Decrypt(dataToDecrypt,null));

}

catch// Opsitonel parametreyi aşağıda boş bırakacağız.

{

strCnx="";

}

return strCnx;

}

}

}

 

 

ConnectionString güvenliğimiz için yarattığımız componentimizdede sona ulaştık.Şimdi login.aspx e gidiyoruz.Ve yapılandırma,ayar ve kodlamamızı yukarıdaki componenlerimizide kullanarak baştan yaratıyoruz.

 

login.aspx;

--------------------------------------------------------------------------- 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.Web.Security;

using Encryption;

namespace

SqlInject

{

public partial class baglanti : System.Web.UI.Page

{

protected void Login_Click(object sender, System.EventArgs e)

{

try

{

// Şifreli bağlantı dizesi

string strCnx = SecureConnection.GetCnxString("cnxNWindBest");

// Veritabanı bağlantısını oluşturuyoruz.

using(SqlConnection cnx = new SqlConnection(strCnx))

{

cnx.Open();

SqlCommand cmd = new SqlCommand("procGetHashedPassword", cnx);

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter prm = new SqlParameter("@username", SqlDbType.VarChar,50);
prm.Direction = ParameterDirection.Input;
prm.Value = txtUser.Text;
cmd.Parameters.Add(prm);

// Giriş yapan kullanıcı için alınan hash şifresini yaratıyoruz.

string strHashedDbPwd = (string) cmd.ExecuteScalar();
if (strHashedDbPwd.Length>0)

{

// Girilen şifre ile kayıtlı olan şifre

// arasında doğrulama yapaıyoruz.

if (SaltedHash.ValidatePassword(txtPassword.Text, strHashedDbPwd))

{

FormsAuthentication.RedirectFromLoginPage(txtUser.Text, false);

}

else

{

lblMsg.Text = "Giriş denemesi başarısız oldu.";

}

}

else

{

lblMsg.Text = "Giriş denemesi başarısız oldu.";

}

}

}

catch

{

lblMsg.Text = "Giriş denemesi başarısız oldu.";

}

}

}

}

 

Güvenli bağlantı ve şifreleme component leriyle güvenli ve sağlam bir login.aspx yapılandırması sağlıyoruz.Ben burda bişey daha eklemek istiyorum.Böyle bir site projemiz olduğuna göre siteye kullanıcıda eklememiz gereklidir.Sitenin saldırılarda maruz kaldığı diğer bir alanında add users bölümü olduğunu varsayarsak veritabanına güvenli kullanıcı nasıl ekliyebiliriz ona bakalım.Yukarda yaptığımız ve devam ettiğimiz projemizi bozmadan secure add user methodunu projeye ekleyelim.

Şimdi kodlamamıza bakalım;

 

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.Web.Security;

using Encryption;

namespace SqlInject

{

public partial class AddSecureUser : System.Web.UI.Page

{

 

protected void cmdOk_Click(object sender, System.EventArgs e)

{

// Önce şifreli bağlantı dizesini oluşturuyoruz ardından deşifrelemeyi sağlıyoruz

//ve bağlantıyı kuruyoruz.

using (SqlConnection cnx = new SqlConnection(SecureConnection.GetCnxString("cnxNWindBest")))

{

cnx.Open();

SqlCommand cmd = new SqlCommand("procAddSecureUser", cnx);

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter prm = new SqlParameter("@username", SqlDbType.VarChar, 50);
prm.Direction = ParameterDirection.Input;

prm.Value = txtUser.Text;

cmd.Parameters.Add(prm);

prm = new SqlParameter("@hashedpassword", SqlDbType.VarChar, 100);prm.Direction = ParameterDirection.Input;

prm.Value = SaltedHash.CreateSaltedPasswordHash(txtPassword.Text);

cmd.Parameters.Add(prm);

prm = new SqlParameter("@accesslevel", SqlDbType.VarChar, 20);
prm.Direction = ParameterDirection.Input;

prm.Value = txtAccessLevel.Text;

cmd.Parameters.Add(prm);

prm = new SqlParameter("@email", SqlDbType.VarChar, 100);prm.Direction = ParameterDirection.Input;

prm.Value = txtEmail.Text;

cmd.Parameters.Add(prm);

 

int intRecs = cmd.ExecuteNonQuery();if (intRecs>0)

{

Response.Redirect("Default.aspx");

}

else

{

lblMsg.Text = "Yeni kullanıcı yaratılması başarısız oldu."

;

}

}

}

}

}

 

Bir web projesinde sql injection ve türevlerinden oluşan saldırılara karşı üç(3) aşamadan oluşan güvenlik politikamızı yarattık.Kodlamalarımızla yarattığımız bu güvenli sitede bahsetmediğim sadece içerisinde geçen storeprocedure kavramıdır.Onudaörnek kodu indirdiğinizde içinde bulabilirsiniz.Bu zamana kadar yaptığım cryptography örneklerinide kullanmış olduğumuz makalede aspx web site adına akılda kalan soru işaretlerini kaldırdığımıza inanıyorum.

Örnek olarak storedprocedure leri içeren sql dosyası uygulama dosyasındadır.Örnek kodları aşağıdaki linkten indirebilirsiniz.Herkese iyi çalışmalar.

DM-SqlInjectApp.rar (106,40 kb)


Başka bir makalede görüşmek üzere.Saygı ve sevgilerimle...



Referanslar : Batuhan Tosun , http://security.batuhantosun.com
, http://www.batuhantosun.com
, www.developermania.net
 

  Ad Soyad
  Yorum