Root > Documents > Web Güvenlik Açıkları > ASP & Basic Objects
Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > ASP & Basic Objects
Madde
  Yazar : GangBoy
  Date : 23.11.2004 16:16:30
 
# ASP & Basic Objects
 
ASP Ve Temel Nesneleri 2
[Br]Slm arkadaslar ;
Bu derste Application,Session ve Server Nesnelerini konu alacagiz:
Klasik anlamdaki bir web sitesinde sunucu ile ziyaretçi arasinda surekli bir bag yoktur.Sayfa istegi ziyaretciden gelir ve sunucuda bu bilgiyi gonderir.
Aralarinmdaki iliski bundan ibarettir.Ancak elektronik ticaret siteleri için boyle bir iliski yetersiz kalacaktir.Bu tarz sitelerde kullanicidan birtakim veriler alinir,islenir,bir dönüsüm saglanir.Bu anlamda bir web sitesi uygulama prgrami gibi düsünülebilinir.Asp bütün iliskileri izleyebilen ve düzenleyebilen nesnelere sahiptir.

Oturum(Session)Nesnesi:
Asp de ziyaretci sunucuya baglandigi an,bir oturum (session) baslamistir.Bu durumda sunucu ziyaretçi nesnesi yaratarak,ziyaretçi oturumdan çikana kadar izler.
Bu isle ugrasanlar çok iyi bilirlerki,bir web sayfasindan digerine bir degisken gecirebilmek hemen hemen imkansizdir.Hasbuki bizim sayfamizi tasarlarken ,bütün sayfalar için geçerli olabilecek degisken tanimlamalarina ihtiyacimiz olabilir.Her degisken tanimlamasi ancak o sayfada etkin olur.Bütün sayfalarda geçerli olabilecek degiskenleri,session nesnesi ile tanimlayabiliriz.
Asagidaki gibi bir sayfa olusturarak session degiskeni olusturalim ve bu degiskeni basak bir sayfada kullanalim;

Bu sayfayi session1.asp adiyla kaydedin:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>session</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

Session("ad")="gangboy"

%>

<bOdy>

<A href= "session_cevap.asp"> Linke tikladigimizda bu sayfada olusturulan session

degiskeni diger sayfaya deger döndürecek </A>

</bOdy>

</html>

Simdi degiskeni kullanacagimiz sayfayi olusturalim:

Bu da session_cevap.asp olsun :

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>Sesion cevap</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

Merhaba_<%Response.Write(Session("ad"))%>

</BODY>

</HTML>

Ilk sayfa calistiginda sunucu session nesnesi ile ismi "ad" olan bir degisken tanimliyor.Bu deger diger sayfaya link sayesinde tasiniyor.Böylece biz degiskenimizi bir baska sayfaya kolaylikla aktarabiliyoruz.Linke tiladigimizda cikan sayfayi sizde gözlemleyin.

Timeout özelligi:
Bir oturum nesnesi olusturuldugunda,eger ziyaretçi belli bir sure browserinda hiçbir hareket ve yineleme yapmazsa sunucu oturum nesnesini otomatik kapar.Bu süre için eger birsey belirtilmemisse
20 dakika ile tanimlidir.Biz bu süreyi istedigimiz gibi ayarlayabiliriz.
Simdi bu kodlari session_timeout.asp adiyla kaydedelim:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>session timeout</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

Session.Timeout=1

Session("ad")="gangboy"

%>

<bOdy>

<A href= "session_cevap.asp"> Linke tikladigimizda bu sayfada olusturulan session

degikeni diger sayfaya deger döndürecek </A>

</bOdy>

</html>


Burada session timeout özelligi ile ,sunucuya oturum nesnesi 1 dakika olarak olusturmasini istedik.
Bu sayfayi calistirir ve 1 dakika bekleyip linke tiklarsaniz "gangboy" yazisinin goruntulenmedigini goreceksiniz.
Bunun nedeni 1 dk içinde sunucuda bir hareket olmadigindan sunucunun oturum nesnesini kapatmasidir.Bu nedenle degiskenimiz kaybolmustur.
Timeout ile istedigimiz dakika degerini girebiliriz.

Session Nesnesinin içeriginin Elde Edilmesi:
Bir forumdan aldigimiz degerleri session degiskeni olarak da atayabiliriz.Kendi atadigimiz ve forumdan gelen session nesnelerinin içerigini contents(içindekiler) özelligi ile elde edebiliriz.
Asagidaki sayfayi session_form1.asp adiyla kaydedelim:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>Session Form1</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>



<Form action = "session_form_islem.asp" method="post">

Lütfen formu doldurunuz:<p>

AD : <Input NAME="ad" size ="10"><br>

YAS : <Input NAME="yas" size="10"><br>

<Input type="submit" value="GÖNDER">

<hr></form>

</bOdy></html>

Formumuzu degerlendirecek sayfayi session_form_islem.asp adiyla kaydedin:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>session</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>



<%

Session.Timeout=15

Session("ad")=Request.Form("ad")

Session("yas")=Request.Form("yas")

Session("numara")="101"



dim i

dim j



j=Session.Contents.Count



For i=1 to j

Response.Write(Session.Contents(i) & "<br>")

Next

%>

</bOdy>

</html>

Formumuzdan gelen degerler ve bizim atadigimiz degerler session degiskenlerine isim verilerek tanimlandilar.

Session içerigi sayilarak bir degiskene aktariliyor.Sonra içerik sayisi kadar bir dongu olsturularak Session.contents ile içeriginin sayfaya yazdirilmasi saglaniyor.

Session Nesnesinin Içeriginin Degerlendirilmesi:

Son örnegimizi biraz daha gelistirelim.Diyelimki biz session degiskenlerinden sadece belirli kistaslara uyanlari kullanacagiz.
Bu kurallara uymayanlarida degisken tanimindan çikaracagiz.Örnegimizde kullanicinin forma girdigi yas grubuna göre olusturulmus degiskenlerin kullanilmasi saglanacak,yas grubuna uymayan session degiskeni iptal edilecektir.

Asagidaki formumuzu olusturdugumuz sayfayi session_form2.asp adiyla kaydedin:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>Session Form2</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<Form action = "session_remove.asp" method="post">

Lütfen formu doldurunuz:<p>

AD : <Input NAME="ad" size ="10"><br>

YAS : <Input NAME="yas" size="10"><br>

<Input type="submit" value="GÖNDER">

<hr></form>

</bOdy></html>

Formu isleyecek olan sayfayi session_remove.asp adiyla kaydedelim:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>Session remove</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

Session.Timeout=1

Session("ad")=Request.Form("ad")

Session("yas")=Request.Form("yas")

Session("yetiskin_kitap")="yetiskin kitaplari"

Session("cocuk_kitaplari")="çocuk kitaplari"


%>

<bOdy>


<%

If Session("yas")<=18 then

Session.Contents.Remove("yetiskin_kitap")

else

Session.Contents.Remove("cocuk_kitaplari")

end if

dim i

dim j

j=Session.Contents.Count

For i=1 to j

Response.Write(Session.Contents(i) & "<br>")

Next

%>

</bOdy>

</html>

Yas degiskenine göre bir kisitlama yapilarak,uymayan durumdaki session degiskeni remove ile degisken sinifindan çikartiliyor.
Geri kalan satirlar session degiskeninin içerikleriyle yazdiriliyor.Forum ve kisitlamalar sayesinde olasan olayi sizde gozleyin.

Session Nesnesine Toplu Bakis:

Session nesnesinin de her nesne gibi , koleksiyon ,metot ve özellikleri bulunmaktadir.Bunlara topluca bir bakalim.


YAZIM Koleksiyonlar

Session.Koleksiyon Özellikler Metot Olaylar

Session.Özellik Contents CodePage Abandon OnEnd

Session.Metot StaticObjects LCID Contents.Remove(item or index) OnStart

SessionID Contents.RemoveAll()

Timeout

Application (Uygulama) Nesnesi:

Session nesnesini anlatirken,olusturulan yordamlarin ziyaretçi,sunucuya bagli kaldigi sürece bütün sayfalar için geçerli oldugunu söylemistik.
Ziyaretçi sayfayi kapattiginda veya belirlenen süre içinde bir eylem yapilmadiginda session degiskenlerinin ve yordamlarinin sifirlandigini da yukarida belirttik.Bu nesne ile saglanan tanimlamalar bütünü , oturum boyunca ziyaretçiye özel tanimlamalar ve degerlerdir.
Her oturumda degismeyen ve tüm ziyaretçiler için geçerli evrensel tanimlara veya degerlere ihtiyaç duyabiliriz.
Application ,bütün kullanicilar için geçerli degiskenleri olüsturan ,tanimlayan bir nesnedir.
Diyelimki sayfanizda oyun düzenliyorsunuz ve istenilen ziyaretçilerin bu oyuna katilmasini istiyorsunuz.Katilimcilarin kac kisi oldugunu sayfanizdagörmek istiyorsunuz.Her yeni katilimcida,oyuncu adedini gösteren sayacin bir artmasi,bir oyuncu ciktiginda sayacin bir azalmasi gerekmektedir.
Böyle bir uygulama için application nesnesi kullanmaliyiz.Çünkü bu degisken bütün site için geçerlidir.

Örnegimizi yapalim:

"oyun_giris.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>oyun giris</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

Response.Write"<h3>Oyun sayfamiza gitmek istermisiniz?</h3>"

Response.Write"Oyun sayfamizda su an "&application("oyun")&" oyuncu var."

%>

<p><A href= "oyun.asp">evet oyuna girmek istiyorum.</A></p>

Öncelikle yukaridaki gibi bir oyuna giris sayfasi olusturduk.Application ile oyun adinda evrensel bir degisken tanimliyoruz.

Bu degisken bütün site ziyaretçileri için geçerlidir.

Simdi oyuncu sayimizi veren sayfamizi olusturalim:

"oyun.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>oyun</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

session.codepage=1254

Response.Write"<h3>Oyunumuza Hos Geldiniz</h3>"

Application.Lock

application("oyun")=application("oyun")+1

Application.UnLock

Response.Write"Su anda oyunda "&application("oyun")&" kisi var"

%>

<p><A href= "oyun_cikis.asp">oyundan ayril</A></p>

</bOdy></html>

Bu sayfada oyuna katildigimiz zaman application degiskeninin sayisi bir artiyor.
Lock ve Unlock metotlari,uygulamayi locktan baslayip unlocka kadar kilitler.
Bu sürede sadece bir bilgisayarin isi yapilir.Es zamanli ziyaretler için kullanilir.

Oyundan ayrilmak istedigimizde;

"oyun_cikis.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>oyun çikis</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>


<%

Response.Write"<h3>Oyunumuza katildiginiz için tesekkür ederiz .</h3>"

Application.Lock

application("oyun")=application("oyun")-1

if application("oyun")<0 then

application("oyun")=0

end if

Application.UnLock

Response.Write"Su anda oyunda "&application("oyun")&" kisi kaldi"

%>

<p><A href= "oyun.asp">oyuna tekrar katil</A></p>


</bOdy></html>

Gördügünüz gibi application nesnesi ile olusturulan degiskenler,sitedeki bütün kullanicilar için geçerli,global degiskenlerdir.


Application Nesnesine Toplu Bakis:


YAZIM

Application.Koleksiyon Koleksiyonlar Metot Olaylar

Application.Özellik Contents Contents.Remove OnEnd

Application.Metot StaticObjects Contents.RemoveAll OnStart

Lock

Unlock



Global.asa Dosyasi:

Global.asa dosyasi bir Active Server Application dosyasidir.Bu dosya web uygulamasinin çalistirilmasindan itibaren,uygulamada geçerli olan bütün tanimlamalari ihtiva eder.Bu dosyada scriptler,veritabani baglantilari,session ve application nesnelerigibi sitenin tamaminda geçerli olacak yordamlar yazilabilir.Örnek olarak sunucu herhangi bir sebepten dolayi reboot edilirse
"application"nesnesinin "OnStart" ve "OnEnd" olaylari bu sayfada tanimlanarak oturum basladiginda veya bittiginde degiskenlerin hangi degerleri alacagini belirleyebiliriz.

Simdi asagidaki gibi global.asa dosyasi olusturup bunu root dizinine kaydedelim;


Sub Application_OnEnd()

End Sub

session.Timeout=1

Sub Application_OnStart()

Application("simdikiziyaretcisayisi") = 0

Application("toplamziyaret") = 0

End Sub



Sub Session_OnEnd()

Application("simdikiziyaretcisayisi") = Application("simdikiziyaretcisayisi") - 1

End Sub



Sub Session_OnStart()

Application("simdikiziyaretcisayisi") = Application("simdikiziyaretcisayisi") + 1

Application("toplamziyaret") = Application("toplamziyaret") + 1

End Sub

Session nesnesinin "global.asa"dosyasinda tanimlanan "OnEnd" ve "OnStart" olaylari,kullanici oturumu basladiginda veya bittiginde yapilmasi gerekenleri tanimlar.
Örnegimizde kullanici baglantiya geçtiginde sitenin genelinde geçerli olan application degisken degerlerinin birer artirilmasinin tanimi yapiliyor.
Baglanti kesildiginde ise sadece "simdikiziyaretcisayisi" adli application 1 azaliyor.Bu sayfadaki degiskenleri kullanarak,ziyaretçilerimize sunucunun çalistigi tarihten itibaren sitemizi kac kisinin ziyaret ettigi ve su anda kaç kisinin baglantida oldugunu bildirebiliriz.

"ziyaretci.asp"


<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>ziyaret</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>


<%Response.Write "<h4>Su an sitemizde " & Application("simdikiziyaretcisayisi") & " ziyaretçi bulunmaktadir, </h4>"

Response.Write "<h4>Simdiye kadar sitemizi toplam olarak "& Application("toplamziyaret") & " kisi ziyaret etti.</h4>"%>

<bOdy>

</html>

Sayfamizi yüklersek suucu ilk önce global.asa dosyasini tarayarak bu sayfada kullanilan degiskenler için tanimli yordamlarin olup olmadigini kontrol eder.
Böyle bir durum var ise gerektigini yerine getirir.Global.asa dosyasi ile scriptler ve veritabani baglantilarida olusturabilriz.

Server Nesnesi:

Server nesnesi sunucu üzerinde özellik ve metotlara ulasmayi saglar.Bu özellik ve metotlarin en çok kullanilanlarina sira ile bakalim.

Server Script Time Out:

Normal bir sayfadaki scriptlerin belirli bir süre çalismasi beklenir.Bu süre aksi belirtilmedikçe 90 sndir.90 sn içinde tamamlanmassa sunucu scriptin çalismasini durdurur.

<% Server.ScriptTimeout = 150 %>

BU örnekte çalisma süresini 150 sn belirledik.

Create Object Metodu:

Bu metotla sunucuda nesneler yaratilabilinir.Sunucunun önemli metotlarindan biridir.Asagida veritabani baglantisini gerçeklestiren bir sunucu nesnesinin olusturulmasini görüyoruz.


<% set baglantim = Server.CreateObject("ADODB.Connection") %>


Execute Metodu:

Bu metot bir ASP sayfasi içinden,baska bir ASP sayfasi çagirmamiza izin verir.

"execute.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>execute</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>


Genel olarak <%Server.Execute("cagirilansayfa.asp")%> kitaplarini okurum.

</BODY>

</HTML>


"cagirilansayfa.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>cagirilan sayfa</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>


<%Response.write " macera "%>

</BODY>

</HTML>

Bu sekilde execute ile sayfamizi çagirdik.

HTML Encode Metodu:

Bazen sayfalarimizda HTML taglarinda kullandigimiz karakterlerin gözükmesini isteyebiliriz.HTML encode metodu bu dönüsümü ASCII ile browser in anlayacagi sekilde yapar.

"HTML_encode.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>HTMLEncode</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%Response.Write Server.HTMLEncode("Server.HTMLEncode Metodunu Kullanmasak <b> tagi HTML olarak yorumlanacakti. ")%>

</BODY>

</HTML>

MapPath Metodu:

Sunucu üzerindeki sayfalarin fiziksel yolu ile scriptlerimizde kullandigimiz yol tanimi arasinda fark vardir.Örnegin biz scriptlerimizde bir sayfaya ulasmak için sunucu adiyla baslayan bir tanim yazariz ama gerçekte farkli bir fiziksel root dizinindedir.MapPath metodu bu gerçek dizine göreli bir yol olusturulmasini saglar.

"MapPath.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>MapPath</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>



<b>Server.MapPath("test.asp")</b> Dosyasinin Sunucu Üzerindeki fiziksel yolu:

<h4> <% Response.Write Server.MapPath("test.asp") %></h4>

<b>Server.MapPath("\test.asp")</b> Dosyasinin Sunucu Üzerindeki fiziksel yolu:

<h4> <% Response.Write Server.MapPath("\test.asp") %></h4>

<b>Server.MapPath("test\test.asp")</b> Dosyasinin Sunucu Üzerindeki fiziksel yolu:

<h4><% Response.Write Server.MapPath("test\test.asp") %></h4>

<b>Server.MapPath("\")</b> Dosyasinin Sunucu Üzerindeki fiziksel yolu:

<h4> <% Response.Write Server.MapPath("\") %></h4>dir.

</BODY>

</HTML>

Yukaridaki kodu yazip çalistirirsak dosyalarimizin sunu üzerindeki fiziksel yollarini görebiliriz.

Transafer Metodu:

Bir ASP sayfasinin baska bir asp sayfasina transfer edilmesini saglar.2.Asp sayfasi içinde ilkinin tüm islemlerini çalistirir.
Execute metodunun tam tersidir.

"transferedileceksayfa.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>transfer edilecek sayfa</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>



<%

session("kitap_adi") = "beyazkale"

session("yayim_tarihi") = "05/06/01"

session("kategori") = "macera"

Server.Transfer("transfericalistransayfa.asp")

%>

</BODY>

</HTML>

Yukaridaki saufadaki degerler asagida olusturdugumuz sayfa tarafindan alinip islenecektir.

"transfericalistransayfa.asp"

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-9">

<meta http-equiv="Content-Type" content="text/html;charset=windows-1254">

<title>transferi çalistiran sayfa</title>

</head>

<% @ LANGUAGE=VBScript CODEPAGE=1254 %>

<%

Response.Write "<h4>Asagdaki çiktilar bu sayfanin verileri ile baska sayfada çalistirilmistir</h4>"

For Each Item in session.Contents


Response.Write Item & "=" & session.Contents(Item) & "<BR>"

Next

%>


</BODY>

</HTML>


YAZIM Özellikler Metot

Server.Özellik ScriptTimeout CreateObject(type_of_object)

Server.Metot Execute(yol)

GetLastError()

HTMLEncode(string)

MapPath(yol)

Transfer(yol)

URLEncode(string)


Bu bölümdede birçok nesne ve bunlarin metotlarini gördük.Bu derslerin amaci aslinda bir siteyi hacklemekten çok onun nasil yapildigini ögrenmektir.Zaten bunun disindada gercek anlamda hack olmaz.
Bu bölümü iyi anlayabilmek için ve bu dersler sonucunda istedigim sonuca ulasmak için dersleri adim adim okuyun ve uygulayin. Ve hiçbir derleri atlamayin.

Bundan sonraki dökümanda Cookie ler konusundan bahsedecegim herkese iyi çalismalar.
Selametle
<%
Bu döküman Gangboy tarafindan yazilmistir.
Written by Gangboy
%>

   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©