SaGo-CeMaL
02-01-2006, 04:56 PM
Web uygulamalarınızı hackerlara karsı korumak onemli zor bir gorevdir. Yetkilendirme seviyelerini, oturum kimlilerini, kullanıcı hesaplarını bu zor gorev için bilgi duzeyiniz dogrultusunda kullanabilirsiniz. Bununla beraber saldırılarda en sık kullanılan tekniklerden biri de girdi acıgı kullanmaktır. Örnegin muşteri bilgilerinizin oldugu bir web uygulaması olsun ve 448 nolu musteri bilgilerini goruntulemek için kullanılan URL; [Only Registered Users Can See Links] ([Only Registered Users Can See Links]) olsun. 448 nolu musterinin 449 nolu musteri bilgilerine erişmemesini sağlayan nedir? Yada SQL kodlarının yazılıp bizim yazdıgımız kodlara çalıştırılmasını engelleyen nedir? Fakat sunu soyleyelim bu dokuman sihirli bir degnek gibi onemli verilerine karsı koruma saglamayacaktır. Bu dokuman kullanıcıların girdiği degerleri kodlarınızla karsılastırıp gecerli girdiler olup olmadıgını basit bir şekilde anlatıcaktır. Bu dokumandaki ornekler kolaylıkla kendi web sitenize -sayfa sayısı ne olursa olsun- eklenebilir ve bu tarz saldırılara karsı etkili bir cozum olusturabilir. Bu fikrin temeli oldukca basittir ve sadece 3 bileşen içerir;
1\ Geçerli veri kontrol classı
Bu class gecerli degerleri kontrol edicek statik methodlar içerecektir. Ornegin eger biz 12 karakter uzunlugunda bir sozdizimi bekliyorsak, bu class onu kontrol edicek ve eger uygun olmayan degerlerle karsılasırsa bunları her girildiğinde duzenleyecektir. Bunu olusturmak için vericeğimiz ornek kodda birkac yol bulunmaktadır.Ayrıca dilerseniz kendinizde ekleyebilir, duzenleyebilirsiniz.
2\ Web.Config
Bu dosyada uygulama anahtarlarımızın hepsini barındıracagımız dosyadır. Ornegin eger biz musteriID anahtarına girilen tam sayı[integer] degerlerini kontrol ettirecektsek, web.congif dosyamıza <safeParameters> adlı anahtarı olusturup degerinide musteriID-int32 yapmalıyız. Bu sayede musteriID degerlerinin surekli olarak tam sayı olup olmadıgı kontrol edilecektir.
3\ Global.asax
Bu uygulamada bizim tum bilinen girdileri degerleriyle eşleştiren faydalı bir method kullanıcagız. Bu method isValidParameter olarak adlandırılabilir. Sayfa her calıstırldıgında bu methodda calısır ve girdilerin gecerli oludugunu sayfaya bildirir.
Bu uc bilesenin birbirleriyle calısma fikri oldukca basittir ve su sekilde orneklenebilir;
Girdi kontrolunu saglayacak faydalı methodları hazırla, tum gecerli girdileri tanımla ve her sayfa için gecerli degerleri kontrol et.
Bu bileşenleri baska uygulamara yerleştirmekte oldukca basittir, ve calısan sitenizi hackerların girdisaldırılarına karsı korur. Unutulmaması gereken bir noktada bu kodlar siteniz için bir eklentidir ve her eklenti kodların calısma performanslarını etkiler. Fakat girdi acıklarına karsı korunmak istiyorsanız bu sizin çozumunuzdur.
Guvenlik kodunun diger kodlara eklenmesi
1\\ acagıdaki parameterCheck.cs kodunu yeni classımzın içine kopyalayıp yapıstırın
public class parameterCheck{
public static bool isEmail(string emailString){
return System.Text.RegularExpressions.Regex.IsMatch(email String, "[’\w_-]+(\.[’\w_-]+)*@[’\w_-]+(\.[’\w_-]+)*\.[a-zA-Z]{2,4}");
}
public static bool isUSZip(string zipString){
return System.Text.RegularExpressions.Regex.IsMatch(zipSt ring ,"^(\d{5}-\d{4})|(\d{5})$");
}
}
2\\ Web.Config dosyasmızı acıp içine <appSettings> tagı yerleştiriyoruz. <safeParameters> anahtarı ile gerekli olan tüm girdileri kontrol etmemizi sağlayacaktır, örnegin; musteriID-int32,musteriEmail-email
<appSettings>
<add key="safeParameters" value="OrderID-int32,CustomerEmail-email,ShippingZipcode-USzip" />
</appSettings>
3\\ Global.asax dosyanıza asagıdaki Application_BeginRequest methodunuda kopyalayıp yapıstırın
protected void Application_BeginRequest(Object sender, EventArgs e){
String[] safeParameters = System.Configuration.ConfigurationSettings.AppSett ings["safeParameters"].ToString().Split(’,’);
for(int i= 0 ;i < safeParameters.Length; i++){
String parameterName = safeParameters.Split(’-’)[0];
String parameterType = safeParameters.Split(’-’)[1];
isValidParameter(parameterName, parameterType);
}
}
4\\ isValidParameter methodunu Global.asax içine kopyalayıp yapıstırın. Bu method isteginize gore duzenlenebilir ve duzenlemesi şiddetle onerilir.
public void isValidParameter(string parameterName, string parameterType){
string parameterValue = Request.QueryString[parameterName];
if(parameterValue == null) return;
if(parameterType.Equals("int32")){
if(!parameterCheck.isInt(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("double")){
if(!parameterCheck.isDouble(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("USzip")){
if(!parameterCheck.isUSZip(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("email")){
if(!parameterCheck.isEmail(parameterValue)) Response.Redirect("parameterError.aspx");
}
}
İşte bu kadar! Bir az once web uygulamanızı girdi acıklarına karsı korumus oldunuz. Son eklediğimiz methoda yapacagınız eklemeler sayesinde guvenlik uygulamasını cok daha fazla geliştirebilirsiniz.
Örnek kodların zipli hali; [Only Registered Users Can See Links] ([Only Registered Users Can See Links])
1\ Geçerli veri kontrol classı
Bu class gecerli degerleri kontrol edicek statik methodlar içerecektir. Ornegin eger biz 12 karakter uzunlugunda bir sozdizimi bekliyorsak, bu class onu kontrol edicek ve eger uygun olmayan degerlerle karsılasırsa bunları her girildiğinde duzenleyecektir. Bunu olusturmak için vericeğimiz ornek kodda birkac yol bulunmaktadır.Ayrıca dilerseniz kendinizde ekleyebilir, duzenleyebilirsiniz.
2\ Web.Config
Bu dosyada uygulama anahtarlarımızın hepsini barındıracagımız dosyadır. Ornegin eger biz musteriID anahtarına girilen tam sayı[integer] degerlerini kontrol ettirecektsek, web.congif dosyamıza <safeParameters> adlı anahtarı olusturup degerinide musteriID-int32 yapmalıyız. Bu sayede musteriID degerlerinin surekli olarak tam sayı olup olmadıgı kontrol edilecektir.
3\ Global.asax
Bu uygulamada bizim tum bilinen girdileri degerleriyle eşleştiren faydalı bir method kullanıcagız. Bu method isValidParameter olarak adlandırılabilir. Sayfa her calıstırldıgında bu methodda calısır ve girdilerin gecerli oludugunu sayfaya bildirir.
Bu uc bilesenin birbirleriyle calısma fikri oldukca basittir ve su sekilde orneklenebilir;
Girdi kontrolunu saglayacak faydalı methodları hazırla, tum gecerli girdileri tanımla ve her sayfa için gecerli degerleri kontrol et.
Bu bileşenleri baska uygulamara yerleştirmekte oldukca basittir, ve calısan sitenizi hackerların girdisaldırılarına karsı korur. Unutulmaması gereken bir noktada bu kodlar siteniz için bir eklentidir ve her eklenti kodların calısma performanslarını etkiler. Fakat girdi acıklarına karsı korunmak istiyorsanız bu sizin çozumunuzdur.
Guvenlik kodunun diger kodlara eklenmesi
1\\ acagıdaki parameterCheck.cs kodunu yeni classımzın içine kopyalayıp yapıstırın
public class parameterCheck{
public static bool isEmail(string emailString){
return System.Text.RegularExpressions.Regex.IsMatch(email String, "[’\w_-]+(\.[’\w_-]+)*@[’\w_-]+(\.[’\w_-]+)*\.[a-zA-Z]{2,4}");
}
public static bool isUSZip(string zipString){
return System.Text.RegularExpressions.Regex.IsMatch(zipSt ring ,"^(\d{5}-\d{4})|(\d{5})$");
}
}
2\\ Web.Config dosyasmızı acıp içine <appSettings> tagı yerleştiriyoruz. <safeParameters> anahtarı ile gerekli olan tüm girdileri kontrol etmemizi sağlayacaktır, örnegin; musteriID-int32,musteriEmail-email
<appSettings>
<add key="safeParameters" value="OrderID-int32,CustomerEmail-email,ShippingZipcode-USzip" />
</appSettings>
3\\ Global.asax dosyanıza asagıdaki Application_BeginRequest methodunuda kopyalayıp yapıstırın
protected void Application_BeginRequest(Object sender, EventArgs e){
String[] safeParameters = System.Configuration.ConfigurationSettings.AppSett ings["safeParameters"].ToString().Split(’,’);
for(int i= 0 ;i < safeParameters.Length; i++){
String parameterName = safeParameters.Split(’-’)[0];
String parameterType = safeParameters.Split(’-’)[1];
isValidParameter(parameterName, parameterType);
}
}
4\\ isValidParameter methodunu Global.asax içine kopyalayıp yapıstırın. Bu method isteginize gore duzenlenebilir ve duzenlemesi şiddetle onerilir.
public void isValidParameter(string parameterName, string parameterType){
string parameterValue = Request.QueryString[parameterName];
if(parameterValue == null) return;
if(parameterType.Equals("int32")){
if(!parameterCheck.isInt(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("double")){
if(!parameterCheck.isDouble(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("USzip")){
if(!parameterCheck.isUSZip(parameterValue)) Response.Redirect("parameterError.aspx");
}
else if (parameterType.Equals("email")){
if(!parameterCheck.isEmail(parameterValue)) Response.Redirect("parameterError.aspx");
}
}
İşte bu kadar! Bir az once web uygulamanızı girdi acıklarına karsı korumus oldunuz. Son eklediğimiz methoda yapacagınız eklemeler sayesinde guvenlik uygulamasını cok daha fazla geliştirebilirsiniz.
Örnek kodların zipli hali; [Only Registered Users Can See Links] ([Only Registered Users Can See Links])