Go Back   Birtanem Forumu » Web Tasarim & Web Dünyası » ASP

Web tabanlı yazılımlarda güvenlik | Web tabanlı yazılımlarda güvenlik

Web tabanlı yazılımlarda güvenlik | Web tabanlı yazılımlarda güvenlik em ASP, Web Tasarim & Web Dünyası; Asp Yazılımlarında Basit Ve Orta Düzeyli Güvenlik Arkadaşlar günümüz dünyasında artık herşey internet üzerinden oluyor gibi basit bir cümle kullanmaya ...




Yeni Konu aç Cevapla
LinkBack Seçenekler Arama Stil
Okunmamış 12-14-2007, 13:47   #1
Özel üye
SiHVaR - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: Dec 2007
Mesajlar: 32
Konular:
Tecrübe Puanı: 45
Rep Puanı : 4010
Kıdemi : SiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond repute
Web tabanlı yazılımlarda güvenlik


Asp Yazılımlarında Basit Ve Orta Düzeyli Güvenlik



Arkadaşlar günümüz dünyasında artık herşey internet üzerinden oluyor gibi basit bir cümle kullanmaya niyetim yok zaten herşey ortada bizim ülkemiz her ne kadar bu durumun pekte farkında olmasada bu durum böyle oldu vede böyle olmaya devam edecek. Keşke ülkemizin kurumlarıda gerek özel gereksede kamu kuırumları ve bunların yöneticileri bunun ciddiyetinin farkında olabilseler ancak hepimizinde bildiği üzere putlaşmış tanımların yetiştirdiği nesildende pek bir şey beklemenin faydasıda yok okullarda üstünkörü eğitim ( Eğitim Diyorum Ama Daha Kendisini gören Olmadı Ben Unide Okurken bile görmedim görürseniz bana haber edin O günü Bayram ilan edelim ) bunun yanında tarihimizde olan olayları bazı toplulukların isteğine göre öğrenmemiz yada öğrenmeye (kabul etmeye) zorlanmamız sonucunda ne teknolojiden ne siyasetten ne ekonomiden nede sosyalleşmeden nasibini almamış bir teneke nesil ortaya çıkıyor bu ister kabul edilsin istersede edilmesin 90 küsür senedir böyle haaa diyeceksiniz şimdi kardeşim konumuz güvenlik valla bu güne kadar 50den fazla makale yazdım hepsinde böyle başladım kimseye bir şeyi okuması için zorlamıyorum isteyen okur isteyen okumaz . İsteyen kabul eder isteyen etmez saygı duyarım ve umursamam . Şunu vurgulamak istiyorum tabularını yıkamamış koyun gibi güdülmekten hoşnut olan insanlar bir mevkiye geldikleri zaman herkesi güdebileceklerini sanıyorlar halbuki kimse koyun değil zaten devletimizde o makamlarda oturanlar hala oğlu teyze kızı oldukları içinde onlara neden bunu yaptın diye soran yok işte bu tür insanlar bu gün youtube.com a girişleri engelleyebildiklerini sanıyorlar neyse kendini hacker sanan hackercıklar uyanda bu yanda öğrenmeye çalıştıkları hack yöntemleri ile günlerimizi haftalarımızı verdiğimiz yazılımlarımızı bozmak silmek yada aklınıza gelebilecek saçma şeyleri yapmak için uzun uğraşlar veriyorlar . Bu noktada güzel olan tek şey gerçekten kod yazmayı bilen ile bilmeyenin ayrılmasıdır bir insanın kendine yazılımcıyım diyebilmesi için gereken şartlardan biriside tamamen tutarlılık gösteren öngörüleri yapılmış GÜVENLIĞI tam olan bir yazılım oluşturabiliyor olmasıdır . Ülkemizde çeşitli kod paylaşım sitelerinden yüzlerce kodu kendi pcne çekip 2-3 dk editleyip yazılımcıyım diye dolaşan kod yazdığını ballandırarak anlatan insanlar sizlerde görmüşsünüzdür . İşte bu dökümanın amacı gerçek yazılımcı olma noktasında size ufakta olsa bir şeyler katmak bunu katarkende etik değerleri tam manası ile öğrenmiş olan bir yazılımcı profili ortaya çıkarmak umarım bu yazı dizimin sonunda dökümanımı okuyan arkadaşlara bir nebzede olsun yardımcı olmuş olurum .



Şimdi arkadaşlar sizleride fazla sıkmadan hemen konuya girmek istiyorum sıktıysam şimdiden özür dilerim ?

Bu makalemin bu dizisinde asp yazılımlarımızda nasıl basit ve orta düzeyli güvenlik sağlarız bundan bahsedeceğim zaten basit ve orta düzeyi yaparken veya yaptıkdan sonra kendiniz ileri düzey güvenlik sisteminizi hazırlayacaksınız .



Asp yazılım dili diğer akranlarına göre şu anda biraz öksüz durumda ms in .net mimarisine yaptığı yatırımlardan ve şirket geleceğini bir anlamda kaynak kodu açılmamış kod bloklarını satışı üzerine kuruduğu için ( bence isteyene uzunca anlatırım ) asp değilde aspxi geliştirmekte zaten asp 3.0 en son çıktı baktığımız zaman aspde bir çok döngü işlem yapılabiliyor bazı işlevlerde asp.dll ye ek başka programcılar tarafından yazılıp iis ile çalışması sağlanarak aspnin işlevselleği arttırılmaya çalışılıyor ama diğer web tabanlı yazılım dilleri php ve jsp ( Makalemi 3 dil üzerine yazıyorum başka dil yok demiyorum ) temelde aspnin yapamadığı bir çok şeyi yapabiliyor örneğin resim işleme işlevi yani kütüphaneler sayesinde değişen resimler üretilmesi gibi bir sürü örnek verebiliriz . Bunu aspde ek dlller yada nesneler tanımlayarak yapıyoruz . ( Şunuda belirteyim makalemde bazı şeyleri farklı anlatıyor olmam varlıklarını yada kullanım şekillerini bilmediğim anlamına gelmiyor yada öyle zannedilmesin burada herkesin faydalanması için basit anlaşılabilir olmaya çalışıyorum ) Bunun yanında güvenlik noktasında her web dili sürekli yeni güncellemeler çıkarmasına rağmen mesela php 5. sürümünün ara sürümlerinden jspde yine aynı şekilde ara sürümlerinden devam ediyor ama asp kaplumbağa gibi mesela phpnin geliştiricileri her sürümde çıkan hataları güvenlik sorunlarını bir sonraki sürümde temelden bertaraf ettikleri için yazılımcının kullandığı yazılım dilinin açıklarını bertaraf etme durumu olmuyor ama asp öyle diil bir asp yazılım hazırladığınız zaman querystring ile yada başka deyimler ile aldığınız her veriyi kontrol etmek zorundasınız aksi halde emek verdiğiniz yada büyüttüğünüz çocuğunuz tanınmayacak hale gelebilir . İşte bu noktada aspde yeni functionlar oluşturarak deyimleri birleştirerek kendi güvenlik kalkanınızı oluşturmalısınız aksi halde yazılımınız yol geçen hanı gibi olur her sql injection deyimini nette gören sizin sitenizde bunları denemek isteyecektir . Geliyoruz en civcivli yerlere sql injection nedir . Hemen anlatayım sql injection yazılımlarımızda kullandığımız sql yani veri yönetim komutlarımızın sistemimizi haklar haricinde enjekte edilmesi için kullanılan araçlardır ve bunlarda sql komutlarının kullanımı ile oluyor .



Bir sistem yazarken Öncelikle yapmanız gerekenler

1. mimarinizi baştan aşağı iyi elemine etmelisiniz

2. saldırıların nereden geleceğini öngörmelisiniz

3. saldırılarda neler kullanılabileceğini iyi bilmelisiniz

4. bunları savuşturmayı bilmelisiniz





Mimarinizi baştan aşağı iyi elemine etmek gereksiz kod parçacıklarından gereksiz kod işlevlerinden uzak durmalısınız yani şuda olsun buda olsun şu işlemi şunla yapayım demeyin mesela File system Object nesnesini iyi kullanmalısınız aksi halde fso nesnesi art niyetli kullanıcı iyi niyetli kullanıcı diye ayırmadan herkesin komutunu ifa ettiği için sisteminizde faal bir açık meydana gelmiş olacaktır . Burada nesne seçimlerinizi iyi yapmalısınız yani kullanıcılarınızın gerçekten o işleve ihtiyacı varmı o işlevin komutlarını başka objectlerle yapabilirmiyim diye sormalsınız



Saldırılar sadece kullandığınız objectlerden gelmez örneğin bir haber kısmınız var kullanıcı haberin detaylarını muhakkak ki okumak isteyecektir ama herkes okumak ile yetinmez okurken değiştirmekte ister işte burada hemen sql injection komutlarına başvurur hemen bir örnek ile nasıl yapıldığını ve nasıl engellenebileceğini göstereyim



Diyelim haberlerinizin devamlarını devami.asp diye bir sayfa aracılığı ile okutuyorsunuz tabiki kullanıcı haberi tıklarken haberin kaç numaralı haber olduğunuda devami.asp ye bildirmek zorunda yani kullanıcı linki tıklarken link devami.asp?sayi=4 gibi yada kendi yazdığınız deyime göre şekil alacaktır . Burada sayi yerine istediğinizi yazabilirsiniz sonuçta kesinlikle bu veriyi alırken bunu ya aynı deyime yada başka bir deyime eşitlemek zorundasınız . Şimdi browser bu komutu devami.asp ye iletti sizin yazdığınız kod ise gelen sayı değerini alacak ve db üzerinden 4 nolu haberin detaylarını arayacaktır . basit şekilde



sayi = request.querystring("sayi")



yani sayi stringi al ve sayi değişkenine eşitle hııı burası iyi hoşta ya kullanıcı bunu değiştirdiyse yani devami.asp?sayi=4 yerine devami.asp?sayi=000000000 yazdıysa yada

devami.asp?sayi=4' Delete ?. -- gibi bir sql komutu girdiyse sizin devami.asp deki yazılımınız bunu nerden anlayacak saldırı olduğunu anlayamaz tabi yazılımda her şey sizin zekanızı kodlara dökmeniz ile olur işte burada yapılacakların en başında

birincisi kesinlikle gelen string değeri sayı olacak diyebilirsiniz sayı değilse işlemi asp.dll durdurur bunu şöyle bir komut ile yapabilirsiniz



sayi = request.querystring("sayi")

sayi = Cint(sayi)



Burada sayi tanımımızın kesinlikle sayısal bir değer olduğunuzu belirtiyoruz aksi hallerde asp.dll yorumlama işlemini durduracaktır bu kısa ve kökten bir çözüm olarak karşımıza çıkıyor bunun yanında ek bir bilgi daha vereyim



sayi = request("sayi")



diyerekte değerimizi alabiliriz yada



sayi = Cint(Request.QueryString("sayi")) olarakta verimizi çekebiliriz



ayrıca diyelim burada bir if else yapısı kurarak gelen değer sayı ise detayları yazdırmayı değilsede else deyip response.write komutumuz ile kullanıcıya sistemin vereceği hata mesajı yerine kendi hata mesajımızı verdirebiliriz . sadece bununlada bitmiyor gelen değerin sayısal olup olmadığını incelemenin başka bir yolu daha var onuda aşağıda bir başka kod ile sizlere anlatıyorum bu kodların arasındaki fark ise bir tanesinde gelecek değerin kesinlikle sayısal bir değer taşıdığını aksi değerler taşıyamayacağını söylüyorum aşağıdaki kodda ise sayısal değer taşımaması gerektiğini taşıyorsa da yapması gereken işlemi söylüyorum aşağıdaki komut yazılış olarak farklı gözükse de işlemi aynı kullanmada seçim sizin



sayi = request.querystring("sayi")

if Not IsNumeric(request.querystring("sayi")) then

response.redirect "hata.asp"

response.end

end if



Burada dikkat ederseniz gelen değer sayısal değil ise hata.asp sayfasına yönlendirmesini vede bunun akabinde response nesnesinin işlevini devami.asp için durdurmasını söyledim bu şekildeki kullanımda sitenizin hata sayfalarını oluşturarak daha kaliteli bir yazılım oluşturabilirsiniz ayrıca devami.asp de yorumlama yapmayacaktır



bunu yaptıkdan sonra gelelim browserdan gelen verileri temizlemeye yada gelen komuta göre yorumlama yapıp yaptırmamaya şimdi neler olabileceğini düşünelim ziyaretmizi sayi değerimizi kafasına göre değiştirebilir dbmizde olmayan bir değer girebilir hiç değer girmeyebilir yada sql injectionun temel hata komutlarının başlamasına ve yorumlanmasına sebep olan işaretleri atabilir öncelikle boş değerler ve dbmizde olmayan değer durumlarını inceleyelim . Bunların hepsi gerek güvenlik gereksede yazılımızda çalışabilirlik açısında önemli durumlardır ancak gerçek yazılımcılar değilde kopyala yapıştır çocukları piyasada çok olduğundan bu tarz durumlar hep göz ardı edilmiştir .



Diyelim ana sayfamızda devai.asp ye hiçbir değer yollanmadı haliyle yazmış olduğumuz sayfa hata verecektir çünkü değer yok burada hata vermeyi engellemek için hemen şu şekilde bir kod yazıyoruz



sayi = request.querystring("sayi")

if sayi = "" Then

response.redirect "hata.asp"

else

sayi = Cint(sayi)

end if



bu kodumda ise gelen değeri öncelikle boşmu dolumu yani sayi nesnesi herhangi bir değer taşıdımı taşımadımı şeklinde analiz ediyorum eğer taşımıyorsa response.redirect ile hata.asp sayfasına yönlendiriyorum şayet değer taşıyor ise else diyip öncelikle gelen değerin sayısal olup olmadığına bakıyorum burada şöyle bir şey daha yapabilirsiniz örneğin gelen değerde sayısal değilse de ek bir if else deyimi ile orada hata sayfanızı kullanabilirsiniz aksi haldede zaten iis işlemi durdurup gelen değerin sayısal olmadığını kendi dili ile söyleyecektir anlayana tabikide eee bittimi bitmedi hadi boş değer işini hallettik sayısal değer işinide hallettik geriye acaba dbde girilen değer varmı yokmu ona baktıkmı eee bir bakalım birde sql injection komutlarının temizlenmesi var dimi



şimdi bildiğiniz gibi eof ve bof komutlarımız var veri değişkenlerimizde atabildiğimiz eof ve bof un ne olduğunu anlatmayacağım zaten dbdeki veri tarama işlemlerinden aşikarsınızdır diye düşünüyorum ama genede kısaca değineyim bof ve eof komutlarımızı bir değişkenimiz ile o değişkene ait olan kayıtların listelenmesi sırasında değikenimizin ( tanım cümlelerini pek önemsemem zihnimde daha önemli şeyleri tutmam gerekiyor ister nesne deyin ister değişken deyin isterseniz kazma deyin ne işe yaradıklarını bilin yeter zaten onlar işini yapacaktır ) veri taşıyıp taşımadığına bakar ve sizde ona göre kullanırsınız mesela



if vampire.eof then

Response.write "Hata!"

End if



Burada vampire isimli değişkenim ile veri çekmeden önce vampire değişkenimin değer taşıyıp taşımadığını sorguluyorum şayet yoksa hata mesajımıda sayfaya yazdırıyorum



Gelelim sql injection konusuna bunlar nelerdir ne işe yararlar nasıl engellenirler



Öncelikle bilmeniz gereken hangi simgeleri engelleyeceğinizdir çünkü simgeleri engelledikten sonra girilecek sql komutlarının hiçbir önemi kalmayacaktır ancak aspde bu böyle diğer web tabanlı yazılımlarda aspde geçerliliği olan simgeler yerine farklı methodlar uygulanabilir mesela detay.php?sayi=4+union+select gibi yazabilirsiniz tabiki bu konuya bu makalemin php ile ilgili olan dizisinde detaylıca anlatacağım

Örneğin devami.asp?sayi=4 geldi bu sayının yanına neler eklenerek hata verdirilir vede bu hataları kullanabilirim öncelikle sayının yanına isim vs yazarsanız yazdığınız koda göre hata verir yada mesajınızı iis yazdırır ancak bunlar sizin sql injection yapmanıza yada yapılmasına yaramaz bu durumda kullanılan baş hata simgeleri şunlardır



' * " ; , - % .. .



asp yazılımlarına saldırırken mutlaka ama mutlaka bu simgelerin birini yada bir kaçını bir komut içerisinde kullanılması gerekmektedir bunun yanında delete select gibi yada drop update gibi sql komutlarınında kullanılması gerekmektedir ben bunlara pek girmeyeceğim amacım kimseye sql injection yapmayı öğretmek değil yazılımınızı güvenlik altına almayı basit ve orta düzeyde sağlamayı öğretmek . Bu simgelerin yanında yüzlerce komut kullanılarak serverın kapatılmasına kadar tetikleyiciler iise yorumlattırabilirsiniz hatta bir çoğunuz bilir o kadar çok piyasada duyulduki mesela ms sql db kullanan bir sitenin serverındaki tüm sql işlemlerini durdurmak için sömürülecek bir açık çıkmıştı yıllarrr önce neyse o kapandı da yazılım yazmayı bilmeyenlerin yada kod araklayıcılar nasıl kapanacak keşke onlarında bir yaması olsada piyasadan def olup gitseler . şimdi saldırgan yukarıda verdiğim komutlar ile sayfanıza saldırabilir ancak siz gelen verinin sayısal olduğunu doğruladıysanız sorun yok diyelim doğrulamadınız işte o zaman sorunlar meydana gelecektir yada daha paranoyaklık yapmak istiyorsunuz olsun ben bunları da gerek olmamasına karşın engellemek istiyorum tabiki olur bunlarıda isterseniz yazılımınızın görmezden gelmesini yada bunları görüp ona göre işlem yapmasını sağlayabilirsiniz burada functionlar ile trim komutunu kullanacağınız buda aslında gayet basit ve de güvenliğinizi sağlayacak bir işlem.

Diyelimki devami.asp?sayi=4' şeklinde bir komut geldi ve de yazılımınıza gelen değerin sayı olması gerektiğini söylemediniz olacaklar yazmakla bitmez yani saldırgan yöneticiymiş gibi her şeyi yapar ancak birkaç komut daha yazdırarak o anda kullanılan tablonun adını almak zorunda bunuda bir komutla halledecektir neyse o komuta sizin ihtiyacınız yok zaten .



Burada yapabileceklerimiz

Gelen değerdeki sayı haricindekileri sildirmek = görmezden gelmek

Gelen değer sayı haricinde bir şey varsa işlemi durdurmak



İkinci seçeneği yukarıda detaylıca anlattığım için şimdi sadece birinci seçeneği anlatacağım

Burada öncelikle bir fonksiyon oluşturacağız vede hangi simgelerin temizlenceğini yazılımıza anlatacağız sizlere iki şekilde fonksiyon hazırladım bunlardan birincisinde daha sonra bu yazı dizisinin devamında daha detaylı değineceğim ama şimdi kısaca anlatacağım formlardan gelen veriyi temizleme işlemi ikincisinde ise değerlerden taşınan verinin temizlenmesi şimdi formlardan gelen veriyi nasıl temizleriz örneğin kullanıcımızın formdan yukarıda anlattığım verileri yolladıysa bunların temizlenmesi istediğimizi var sayalım hemen koru adı altında bir fonksiyon oluşturup buna da basit anlamda ek bir ad vererek ( yazılımda ayrıca bir tanımı var ama yazmaya gerek yok maksadım herkesin anlayıp kullanabileceği bir makale ) ki buda kelime adını alıyor bunu yaparak istenmeyen karekterlerin formlardan geçmesini engelliyeceğiz

<%

function koru(kelime)

kelime=replace(kelime, "'" , "" )

kelime=replace(kelime, ";" , "" )

kelime=replace(kelime, "," , "" )

kelime=replace(kelime, "*" , "" )

kelime=replace(kelime, "%" , "" )

kelime=replace(kelime,""","")

kelime=replace(kelime, "-" , "" )

koru=kelime

end function

%>



aslında burada yaptığımın izahatı şöyle gelen değer işte " - vs gibi ise bunu boş değer ile değiştir yada istersem boş değer değilde aşağıdaki gibi bir değere dönüştür



kelime=replace(kelime, "-" , "hata" )



açıklaması formdan ziyaretçi - yollarsa yazılımım onu hata cümlesi olarak dbye yazacak ve sayfada da hata olarak yazacak tabi bu bir örnek yazılımınızda böyle yaparsanız sayfada anlamsız cümleler meydana gelecek siz bunu kendi hayal gücünüze göre düzenlersiniz daha sonrada gelen veriyi bir değişkene atayacağım işte bu atama sırasında yazacağım komut ile önce fonksiyona başvurmasını ve gelen veride fonksiyondaki değerlerden var ise değiştirmesini söyleyeceğim oda şöyle
SiHVaR isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla
Sponsor Reklamlar

Okunmamış 12-14-2007, 13:48   #2
Özel üye
SiHVaR - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: Dec 2007
Mesajlar: 32
Konular:
Tecrübe Puanı: 45
Rep Puanı : 4010
Kıdemi : SiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond repute
Standart


adi = trim(request.form("adi"))

adi = koru(adi)



burada form name in adi olduğunu ve adi ye tekrar eşit olduğunu s&#246;yledim bunun yanında da fonksiyona başvurulup koru ara nesnesine g&#246;re değerlendirilmesi gerektiğini belirttim ayrıca burada trim adında bir komut kullandım buda formun başındaki ve sonundaki boşlukları temizlemek i&#231;in kullanılıyor



ancak herhangi bir fonksiyon hazırlamadan gelen her değeri html kodu haline getirerek dbnize işletebilirsiniz aslında baktığımız zaman &#231;ok faydalı ancak gelişen sisteminizde &#246;rneğin yazdığınız bir metin edit&#246;r&#252;n&#252;zde işinizi bozacaktır anlattığım şekilde ise formunuzdan verinizi aşağıdaki şekilde alırsanız asp.dll gelen her şeyi komut olarak g&#246;rmeyecek ve yorumlamayacaktır yani g&#246;z ardı edecektir ancak



adi = trim(Server.HTMLEncode(request.form("adi")))



yada



adi=html.encode(request.form("adi"))



burada server.html.encode yada html.encode kullanımız dillerdeki karekterlerin kullanımı a&#231;ısından &#246;nem arz eder yani server.html.encode de tr karekterler desteklenmez ayrıca diyelim diye bir yazı geldi formdan sizde bunu bir resime aktarmak isteyeceksiniz server.html.encode yada html.encode bunu yapmanıza izin vermez bu durumda fonksiyon kullanmak zorunda kalırsınız neyse bu uzar konuya d&#246;nelim

bu kullanımlardan birini se&#231;tikden sonrada temizlenmiş/g&#246;z ardı edilmiş veriyi isterseniz adodb.recordset ile istersenizde sql ile dbnize eklersiniz bu işlem asp de veri d&#246;ng&#252;lerine girdiğinden burada değinmeyeceğim



gelelim formlar haricinden yani stringlerden gelen verinin değerlendirilmesine vede temizlenmesine buradada benzer bir fonksiyon kullanacağız tek fark ise her hangi bir dbye veri girişi yapmayacağız sadece gelen gereksiz simgeleri temizleyip sayfada yorumlatacağız yada gereksiz değer var ise yorumlatmayı durdurup var ise hata y&#246;netim sayfamıza yada onun alt d&#246;ng&#252;s&#252;ne iletebilirsiniz bunuda yukarıdaki &#246;rneklerden faydalanarak yapabilirsiniz

gelelim querystring ile aldığınız değerlerin temizlenmesine



&#246;ncelikle bir fonksiyon oluşturuyoruz ama ondan &#246;nce ufak bir şeye daha değinmek istiyorum yazılımlarınızda her sayfada ayrı ayrı fonksiyon kullanmaktansa bir sayfada y&#252;zlerce fonksiyon kullanarak bunları aspe sayfalarınıza <!-- #include file="fonksiyon.asp" --> gibi ekleyerek kod kalabalığından kurtulursunuz neyse biz bu seferde veri okuttuğumuz sayfamıza bir fonksiyon yazıyoruz hemen yazalım kod aşağıda



<&#37;

function security(data)

data = Replace (data ,"'","",1,-1,1)

data = Replace (data ,";","",1,-1,1)

data = Replace (data ,",","",1,-1,1)

data = Replace (data ,"%","",1,-1,1)

data = Replace (data ,"*","",1,-1,1)

data = Replace (data ,""","",1,-1,1)

data = Replace (data ,"--","",1,-1,1)

data = Replace (data ,"-","",1,-1,1)

data = Replace (data ,"/","",1,-1,1)

data = Replace (data ,"\","",1,-1,1)

data = Replace (data ,"And","",1,-1,1)

data = Replace (data ,"Delete","",1,-1,1)

data = Replace (data ,"Drop","",1,-1,1)

security=data

end function

%>



ben sizin i&#231;in ufak bir fonksiyon oluşturdum birka&#231; tanede ek simge ekledim hani kafanıza belki bir şey takılır diye ancak burada &#231;ok &#246;nemli bir nokta var oda şu g&#246;rd&#252;ğ&#252;n&#252;z gibi ben Drop And ve Delete Ekledim burası iyi hoş ancak saldırgan adres satırına delete şeklinde yazarsa bu fonksiyonumun hi&#231;bir &#246;zelliği kalmak unutmayın ki string değer taşırken b&#252;y&#252;k k&#252;&#231;&#252;k harfe duyarlıdır varın gerisini siz d&#252;ş&#252;n&#252;n onun i&#231;in oturup ta ne kadar sql işlem komutu varsa onları fonksiyona dahil etmek yerine ana işleyicileri iptal etmek en akıllıca sı bu fonksiyonu yazdık dan sonra şimdi rahatlıkla adres satırından değerimizi &#231;ekebiliriz



sayi = security(request.querystring("sayi"))



burada sayinin getirdiği değeri security fonksiyonumuza okutuyoruz ve ondan sonra sayi değişkenmize eşitliyoruz bunun yanında gereksiz ek kodlara gerek yok fazlada abartmanın manası yok ama se&#231;im sizin her şeyi bilin ama isterseniz kullanın



Gelelim daha detaylı kısımlara yani &#252;yelik sistemlerine aslında anlatacaklarım sadece &#252;yelik sistemlerinde değil alış veriş sistemlerinde de kullanılan işlemler. Bu tarz yazılımlarda yukarıda bahsettiklerimin haricinde daha detaylı olarak cookieler ve sessionlar da kullanılıyor

Haliyle sistemin daha da iyi analiz edilmesi ve de kullanılan g&#252;venliğin artması gerekiyor . Hemen kısaca cookileri ve de sessionları anlatayım . Cookiler kullanıcılın makinasına yazılımınız tarafından oluşturulup browser aracılığı ile yerleştirilen anlık yada uzun zamanlar kalması istenilen k&#252;&#231;&#252;k veri depolarıdır . Bunlar isteğe g&#246;re kullanıcının pc sinde barındırılan ufak kurabiyelerdir diyebiliriz . İşlevleri hayal g&#252;c&#252;n&#252;ze kalmış bir şey . Sessionlar ise yani oturumlar ise internetin temelinde yer alan terimlerden bir tanesidir . Bir kullanıcı bir siteye girdiğinde ister kodlayın isterseniz kodlamayın ona bir oturum numarası yani session number verilmektedir . İşte biz burada verilen bu numarayı okuyacağız ve kullanıcımızı takip etmekten tutunda işlemlerini daha g&#252;venli yapması i&#231;in session numarasına g&#246;re ona &#246;zel t&#252;neller oluşturmayı inceleyeceğiz . Ama &#246;ncelikle cookiler yani ufak tatlı kurabiyelerimiz



Şimdi sizlere &#246;ncelikle cookileri daha sonrada sessionları anlatacağım peşinede g&#252;venli bir login sisteminin g&#252;venlik kodlamasını yapacağız bunun sonunda da isterseniz yazdığınız bir giriş & &#252;yelik sistemini yada veri sisteminin g&#252;venliğini sağlayacaksınız .



Şimdi bir giriş sistemi hazırladınız cookiler nerede işinize yaracak . burası &#246;nemli &#231;&#252;nk&#252; sırf cookie kullanmış olmak i&#231;in cookie kullanmaya gerek yok hem vakit hemde emek kaybı



Cookilerin bir sistemde kullanım alanı her zaman dediğim gibi sizin hayal g&#252;c&#252;n&#252;z&#252;n sınırlarına kalmış bir şey bence de sınırı yok Bir ziyaret&#231;inin yada bir &#252;yenin sisteminize girdiğinde hatırlanması konusunda g&#252;n&#252;m&#252;zde &#231;ok&#231;a kullanılıyor bu durum aslında &#231;okta g&#252;zel ancak g&#252;venlik zaaflarına sebep oluyor burada biraz phpye dalmamız lazım phpnin geniş k&#252;t&#252;phaneleri sayesinde aspnin yapamadığı bir &#231;ok şeyi yada eklentiler ile yaptığı bir &#231;ok şeyi yapabiliyorsunuz haliylede phpde port y&#246;netimlerine kadar geniş bir yelpaze meydana geliyor burada hazırlanan basit php yazılımları ile basit ama sinsice bir cookie &#231;alma aracı meydana getirilebiliyor bu durum temelde ie nin a&#231;ıklarından kaynaklanıyor ve olayın sonucunda girmiş olabileceğiniz bir web sayfası y&#252;z&#252;nden pcnizdeki herhangi bir cookie başka bir kişiye yada kişilere anında yollanıyor ve sizin kullanım hakkınız olan sayfalara girme hakları elde ediliyor tabiki burada girmiş olduğunuz sayfanında &#246;nemi b&#252;y&#252;k her sitenin cookiesi &#231;alınamıyor tabiki burası ayrı bir konu iyi bir sistemde cookie &#231;alınması gibi bir durum s&#246;z konusu olmuyor . Yukarıda anlattığım basit &#246;rnek gibi bir s&#252;r&#252; &#246;rnek verilebilir her neyse eee bu kadar b&#252;y&#252;k sorunlara neden olabilecek ancak bir o kadarda işe yarayan cookieleri kullanıyorsak nasıl kullanmalıyız



Şimdi arkadaşlar bir cookie hazırlatacaksınız cookiede nelerin tutulacağına iyi karar vermelisiniz yani direk user ve pss. bulunduracanığınız bir cookie hi&#231;te hoş olmaz aynı zamanda basit olur . bir net cafeden d&#252;ş&#252;nsenize y&#252;zlerce cookie alabilirsiniz . sizin kullanıcınızında bunlardan biri olabileceği muhtemeldir . O zaman cookiede direk user ve pss. tutmak yerine tutacağınız verileri farklı tanımlar ile tutabilirsiniz &#246;rneğin şifreyi tutmazsınız da sadece user ve kullanıcının yetkisini belirten bir değer bırakabilirsiniz ancak buradada bir s&#252;r&#252; sorun meydana gelebilir .Birde cookileri zaman aralıklarına g&#246;re tanımlayabilirsiniz istediğiniz s&#252;rede silinmesini yada zaman vermeden tarayıcı penceresi kapatılmasının ardından silinmesini sağlayabilirsiniz. Her neyse cookileri bu kadar incelemek kafi bence zaten g&#252;venlikleri sağlarken bu konuya daha detaylı değineceğim . Ama cookilerin Asp sayfalarında nasıl oluşturulduğunu nasıl okunduğunu hemen g&#246;stereyim



Response.Cookies("vampire")="True"



şeklinde bir cookie yaratabilirsiniz bu cookienin i&#231;inde sadece true yazısı bulunacak yada daha komplike bir cookie yapabilirsiniz mesela



Response.Cookies("Turx")("vampire")="True"



Burada yaptığım ise turx isminde bir cookie oluşturmak vede vampire ismine true değerini atamak işlevi aynı fark olarak diyelim aynı alt yapı ile farklı sistemler yazdınız aynı anda ikisinede girmeye &#231;alıştığınızda cookie tanımlamaları aynı olduğu i&#231;in her iki sistemde de işlevleriniz karışacaktır ancak farklı isimler verdiğiniz zaman herhangi bir sorun &#231;ıkmayacaktır ayrıca hazırladığımız cookilerde herhangi bir zaman belirteci bulunmadığından tarayıcı penceresinin kapanması ile cookielerimizde silinecektir bunun yanında cookielere dbnizdeki bir değeride atayabilirsiniz oda ş&#246;yle &#246;ncelikle db bağlantılarımızı ve tablo bağlantılarımızı yapıyoruz



sql = ("Select * From tablo ")

set Veriler=vampire.execute(Sql)



bağlantımızı sağladıkdan sonra

verimizi &#231;ekiyoruz vede cookiemize yolluyoruz



Response.Cookies("Turx")("atanacak_veri_adi")=veri ler("dbdeki_isim")



aslında bu biraz karışık gelebilir birde recordset kullanarak aynı işlemi farklı isimler ile yapayım isteyen istediğini kullansın



Set Control = Server.CreateObject("ADODB.Recordset")

sql = "Select * from tablo"

Control.Open sql,UserLogBag,1,3





Response.Cookies("turx")("vampire")=control("deger ")



bu cookielerimizi okuyup hemen diğer konumuz olan sessionlara ge&#231;elim



<%Response.write ""& Request.Cookies("turx")("vampire") & ""%>



şeklinde okuyup sayfanıza yazdırabilirsiniz



burada db bağlantımı vede tablo bağlantımı yaptıkdan sonra ( db bağlantısını herhangi bir ortak db yer tanım dosyası ile yapabilirsiniz burada sadece tablo bağlantısını yapıyorum dbye bağlanıldığını var sayıyorum ) turx isimli cookieyi oluşturup i&#231;ine vampire isimli bir tanım oluşturup control bağlantı nesnesi ile dbden degerin karşıladığı değeri &#231;ekip vampireye eşitliyorum . umarım anlaşılır olmuştur cookilerin kısacık &#246;zeti cookieleri bir kitap ile ancak anlatabiliriz aslında ...



Gelelim sessionlara . Yukarıda da anlattığım &#252;zere sessionlar bir ziyaret&#231;inin yada bir kullanıcının server tarafından atanan oturum numarasıdır ki bir &#231;oğunuz bu numaralara tanık olmuşsunuzdur . G&#246;rmeseniz bile bir s&#252;r&#252; sistemde arka planda veri iletimlerinde bir k&#246;pr&#252; g&#246;revi g&#246;rmekteler . En g&#252;zel yanlarından bir tanesi değerlerin serverda tutuluyor olması ve hazırlayacağınız sistemde herhangi bir şekilde kayıt etmediğiniz takdirde tarayıcı pencresi kapatıldığında siliniyor olmaları &#246;rnek olarak diyelim ramstation isimli bir kullanıcı sisteminize girdi server ona yine &#246;rnek olarak 3526954 gibi bir session atadı kullanıcı tarayıcı pencresini kapattığı anda bu numara silinir ayrıca sitedeki ziyaret&#231;ilerin her birine ayrı ayrı session numaraları atanır ve aynı numara farklı kullanıcılara verilemez . Siz yazılımınızda bu numaraları a&#231;ığı &#231;ıkararak kullanıcınızın ipsinide aldırarak o sessionun hangi işlemleri yaptığını zaman olarakda basit kodlarla g&#246;rebilirsiniz . Ancak sessionların bundan daha &#246;nemli işlevleride var bunlardan bir tanesi her kullanıcıya ayrı bir numara veriyor olmasından dolayı bir veri ekleme d&#252;zenleme yada silme işleminde bu numarayı kullanarak gerek bir anda y&#252;zlerce verinin girilmesini engelleyebilirsiniz gereksede tarayıcı haricinde saldırı programları ile formlarınız aracılığı ile saldırıların yapılmasını engelleyebilir yada daha ileri giderek o kullanıcıyı sistemden atabilirsiniz Hayal g&#252;c&#252;n&#252;ze g&#252;veniyorsanız sorun yok. &#246;rnek olarak hemen session alımını g&#246;stereyim detaylı kullanımada ilerleyen sayfalarda ge&#231;eceğim



&#246;ncelikle session değerimizi yakalamayı &#246;ğrenelim bu şekilde session değerini yakalayabilirsiniz yakaladıktan sonra herhangi bir post yada get işleminde kullanabilirsiniz



<%=session.sessionID%>



şimdide &#246;rnek olsun diye bir post işleminde onu kullanıma a&#231;alım



<form method="POST" action="loggin.asp?vampire=<%=session.sessionID%>" >

artık sessionumuzu g&#246;rebiliriz vampire tabımız session değerimize eşit durumdadır

Şimdide sessionumuzu basit bir rasgele veri &#252;retici bir kod yazalım vede sonucu hem sayfaya yazdırıp hemde sessiona atayalım oluşacak rasgele verimiz 6 karekter uzunluğunda olsun ve sayı harf ve simgeleri kapsayacak şekilde olsun



<%

For i = 1 To 6 ' For d&#246;ng&#252;s&#252; ile başlıyoruz

Randomize

bas=33

son=125

rasgele61=rasgele61 + chr(int((son - bas + 1) * rnd + bas))

Next

session("trabzon")=rasgele61 ' sessionumuzu trabzon ismi ile oluşturup rasgele oluşturtuğumuz değerimize

'yani rasgele61 e eşitliyoruz daha sonrada sayfaya yazdırıyoruz

Response.write "<center>"&rasgele61

%>





yukarıda basit olarak 2 şekilde session tanımlamalarını kullandık buradan &#231;ıkaracağımız sessionların oturum değeri olduğudur vede yazılımcı tarafından da belirleneceği gibi kendimizinde bir session oluşturabileceğidir ama genelde session olarak serverın oluşturduğu değer kullanılır. Sakın yanlış anlaşılmasın sessionlar sadece server tarafından &#252;retilmez yukarıda biraz daha kolay anlaşılabilir olması amacı ile serverler tarafından oluşturulan session tanımlarını anlattım buradada tanımlamamı biraz daha a&#231;arak session un nedemek olduğunu kavratmaya &#231;alıştım . Yoksa sessionlara k&#246;pr&#252; der ge&#231;erdim sessionlarda cookieler gibi bir s&#252;r&#252; ara tanım i&#231;ermektedir vede anlatılması bir kitap alır .





Evt bu kadar session ve cookie işleminden sonra bu makelenin asp b&#246;l&#252;m&#252;n&#252;n son kısmına ge&#231;elim vede Asp b&#246;l&#252;m&#252;m&#252;z&#252; bitirelim . Yukarıda anlattığım kullanımları dolaylı yada direk olarak birazdan bizlere lazım olacak bunuda bilmenizde yarar var ...



Arkadaşlar bir sisteminiz var ya &#252;ye girişi yada &#252;ye kayıtı ve girişi yada edit&#246;r y&#246;netim paneli kısacası veri işlemleri yapılabilecek bir yazılımınız var vede bu sistemde herkesin hakkı dahilinde işlemler yapmasını sağlıyor . Haliyle sisteminizi yetkileri dahilinde herkes kullanmak istemeyecek yada yetkilerini aşmaya &#231;alışacak kullanıcılar olacaktır işte burada ben sizlere bir giriş sistemi tasarlayacağım vede siz bu giriş sisteminden kendinize yeni sistemler oluşturacaksınız yada veri ekleme sistemlerinizi yeniden şematize edeceksiniz . Yani aşağıda anlatacağım mevzu tamamiyle bir login sistemi şeklinde olacak . Bizde sistemimizin g&#252;venliğini nasıl sağlayabileceğiz onu g&#246;receğiz



Şimdi bir &#252;ye giriş panelinde temelde var olacak iki form vardır bunlardan biri kullanıcı adının yazıldığı diğeride kulanıcının şifresini yazdığı formlardır bunun yanında isteğe g&#246;re başka verilerinde girilerek daha &#231;ok sorgu sağlanarak girişlerin kontrol edilmesi sağlanabilir . Tabiki bu s&#246;ylediklerim her sistemde olacak diye bir kayde yok isteyen istediği gibi yazar .
&#214;ncelikli olarak yapmamız gereken sistemimize başkalarından &#246;nce kendimizin saldırması ve g&#252;venlik analizinin yapılmasıdır . Diyelim ki sistemimizde yaptığımız analizlerde sql injection a&#231;ıkları ek yazılımlar ile brute force saldırı tekniğinin yada aklınıza gelebilecek diğer saldırı şekillerinin hepsi işe yarıyor vede sisteme giriş yapılıyor paniğe gerek yok her şeyin ilacı d&#252;nyada var sadece bulmak &#246;nemli .





Yapacaklarımızı sıralayacak olursam



Formlarda sınırlamalar yapmak bunlarda gerek karekter sayısının d&#252;zenlenmesi

Her oturuma numara vermek yani sessionların kullanımı

Sayfalara s&#252;re tanımlamaları Koymak ( Belli zaman aralıkları ile işlem hakkı tanınması )

G&#252;venlik kodu eklenmesi

Formlara girilen sql injection karekterlerinin yada kodlarının temizlenmesi

Cookielerin Kullanımların g&#246;zden ge&#231;irilmesi ve cookie kullanım&okuma işlemlerinde revizyonların yapılması

Son olarakta Kullanıcı şifrelerinin kriptolanması



&#246;ncelikle formlarımızdan fazlaca karekter girilmesini engellemeliyiz ki bu basit bir olay ancak ge&#231;ilmeside basit ama ben ge&#231;ilmesini değilde karekter sınırının konulmasını g&#246;stereceğim bu sayede sisteme giriş deneyen kişiler giriş sayfasında belirlediğiniz karekter sayısı dışında karekter girmesini engelleyebilir vede uzun olan sql injectionlardan bir nebze kurtulmuş yada saldırıları yavaşlatmış olabilirsiniz



kullanacağımız kodu yazayım hemen



maxlength="6"



işte kullanacağımız kod bu buradaki sayı değeri kullanıcının girebileceği karekter sayısını belirliyor vede o sayıdan fazla karekter girilmesini engelliyor &#246;rnek bir form ile g&#246;sterip devam edeyim





<input type="text" name="vampire" maxlength="6" >





yukarıdaki tanımda sizlerinde g&#246;rd&#252;ğ&#252; gibi vampire isimli forma sadece 6 karekter girilmesini tanımladım bu basit bir engelleme methodu bunu javasc. ile de yapabilirsiniz vede ge&#231;ilmeleri gayet basit kaldiki biz basit &#246;nlemlerden başlayıp en yukarıya kadar devam edeceğiz .



gelelim her oturuma numara atanmasına vede bunumarayı sorgulatmaya &#246;ncelikle bu işlemin yararını anlatayım yukarıda yazmış olduğum saldırı y&#246;ntemlerinden bir tanesi olan brute force saldırı y&#246;nteminde sisteminize giriş denemeleri yapılarak kullanıcılarınızın şifreleri bulunabilir yada ziyaret&#231;i defteri gibi uygulamalarınıza 5 sn i&#231;inde 500den fazla post atılabilir tabiki bu tarz saldrıların meydana gelmesini kimse istemez işte oturum numarasını da sayfamızda veriler ile post ederek basit bir g&#252;venlik kalkanı meydana getireceğiz



hemen başlayalım



&#246;ncelikle kullanıcı ve şifrenin yazıldığı sayfada işlem yapacağız



mesela



<form method="POST" action="loggin.asp">



şeklinde bir giriş sorgulama işlemimiz olsun burada formlara girilen veriler post methodu ile loggin.asp karşılaştırılarak sizin kodladığınız mekanizmanın işlemesi sağlansın forma veri girilen sayfamızda yapacağımız işlemimiz olduk&#231;a basit



yukarıdaki işleme hemen bir değişken ekleyip o değişkenede session numarasını taşımasını s&#246;yleyeceğiz yani



<form method="POST" action="loggin.asp?vampire=<%=session.sessionID%>" >



bunu yaptığınızda artık her işlemde adres satırında loggin.asp şeklinde giden bir sorgu yerine loggin.asp?vampire=546555564

gibi bir şekilde postunuz gidecektir buradaki sayıları salladım o sayıları server kendisi verecek burada yaptığım aslında session nesnesine sessionidyi yani oturum numaramızı eşitlemek onuda bir değişkene atayarak başka bir sayfa adres satırı aracılığı ile taşımak bu işlemi cookiler ile de yapabilir yada numaranın g&#246;r&#252;nmesini basit&#231;e engellemek i&#231;in gizli formlar aracılığı ilede taşıtabilirsiniz



gelelim loggin.asp ye dananın kuyruğunun koptuğu yer bu sayfamızda bir if else yapısı kurarak adres satırından gelen değerin vampire değişkenine atatığımız değerin olup olmadığını sorgulayacağız genelde yazılan brute force yazılımları &#231;ok komplike diildir tabiki bunlar piyasaya s&#252;r&#252;lenler i&#231;in ge&#231;erlidir daha komplike olanlarda daha farklı y&#246;ntemler uygulanıyor mesela kendi sayfa tarama motoru yazılmış olanlarda var neyse alacağımız g&#252;venlik &#246;nlemlerinden sonra hi&#231; birinin bir ehemmiyeti kalmayacak



if else yapımız

if NOT request.querystring("vampire") = session.sessionID then

response.write "<br><br><br><center>Hata !<br><br><center>"

response.write "<center>Session Kayıtları Uyuşmuyor !"

response.end

else

end if



burada vampire değişkenini adres satırından aldırıyoruz vede bir &#246;nceki sayfada yaptığımız işlemi aynen tekrarlıyoruz şayet değişkenin taşıdığı değer doğru değilse hata mesajımızı yazdırıyoruz ve sayfadaki sorgulamayı durduruyoruz değer doğru isede herhangi bir şey yapmadan sorgulamaya devam ediyoruz orta d&#252;zeyli bir brute force yazılımında yada post atackerlarda sessionlarla ilgili bir şey bulunmadığından saldırı burada kesiliyor haa ge&#231;emez demiyor ge&#231;sin daha &#231;ok engelimiz var
SiHVaR isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla

Okunmamış 12-14-2007, 13:50   #3
Özel üye
SiHVaR - ait Kullanıcı Resmi (Avatar)
Üyelik tarihi: Dec 2007
Mesajlar: 32
Konular:
Tecrübe Puanı: 45
Rep Puanı : 4010
Kıdemi : SiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond reputeSiHVaR has a reputation beyond repute
Standart


adi = trim(request.form("adi"))

adi = koru(adi)



burada form name in adi olduğunu ve adi ye tekrar eşit olduğunu söyledim bunun yanında da fonksiyona başvurulup koru ara nesnesine göre değerlendirilmesi gerektiğini belirttim ayrıca burada trim adında bir komut kullandım buda formun başındaki ve sonundaki boşlukları temizlemek için kullanılıyor



ancak herhangi bir fonksiyon hazırlamadan gelen her değeri html kodu haline getirerek dbnize işletebilirsiniz aslında baktığımız zaman çok faydalı ancak gelişen sisteminizde örneğin yazdığınız bir metin editörünüzde işinizi bozacaktır anlattığım şekilde ise formunuzdan verinizi aşağıdaki şekilde alırsanız asp.dll gelen her şeyi komut olarak görmeyecek ve yorumlamayacaktır yani göz ardı edecektir ancak



adi = trim(Server.HTMLEncode(request.form("adi")))



yada



adi=html.encode(request.form("adi"))



burada server.html.encode yada html.encode kullanımız dillerdeki karekterlerin kullanımı açısından önem arz eder yani server.html.encode de tr karekterler desteklenmez ayrıca diyelim diye bir yazı geldi formdan sizde bunu bir resime aktarmak isteyeceksiniz server.html.encode yada html.encode bunu yapmanıza izin vermez bu durumda fonksiyon kullanmak zorunda kalırsınız neyse bu uzar konuya dönelim

bu kullanımlardan birini seçtikden sonrada temizlenmiş/göz ardı edilmiş veriyi isterseniz adodb.recordset ile istersenizde sql ile dbnize eklersiniz bu işlem asp de veri döngülerine girdiğinden burada değinmeyeceğim



gelelim formlar haricinden yani stringlerden gelen verinin değerlendirilmesine vede temizlenmesine buradada benzer bir fonksiyon kullanacağız tek fark ise her hangi bir dbye veri girişi yapmayacağız sadece gelen gereksiz simgeleri temizleyip sayfada yorumlatacağız yada gereksiz değer var ise yorumlatmayı durdurup var ise hata yönetim sayfamıza yada onun alt döngüsüne iletebilirsiniz bunuda yukarıdaki örneklerden faydalanarak yapabilirsiniz

gelelim querystring ile aldığınız değerlerin temizlenmesine



öncelikle bir fonksiyon oluşturuyoruz ama ondan önce ufak bir şeye daha değinmek istiyorum yazılımlarınızda her sayfada ayrı ayrı fonksiyon kullanmaktansa bir sayfada yüzlerce fonksiyon kullanarak bunları aspe sayfalarınıza <!-- #include file="fonksiyon.asp" --> gibi ekleyerek kod kalabalığından kurtulursunuz neyse biz bu seferde veri okuttuğumuz sayfamıza bir fonksiyon yazıyoruz hemen yazalım kod aşağıda



<%

function security(data)

data = Replace (data ,"'","",1,-1,1)

data = Replace (data ,";","",1,-1,1)

data = Replace (data ,",","",1,-1,1)

data = Replace (data ,"%","",1,-1,1)

data = Replace (data ,"*","",1,-1,1)

data = Replace (data ,""","",1,-1,1)

data = Replace (data ,"--","",1,-1,1)

data = Replace (data ,"-","",1,-1,1)

data = Replace (data ,"/","",1,-1,1)

data = Replace (data ,"\","",1,-1,1)

data = Replace (data ,"And","",1,-1,1)

data = Replace (data ,"Delete","",1,-1,1)

data = Replace (data ,"Drop","",1,-1,1)

security=data

end function

%>



ben sizin için ufak bir fonksiyon oluşturdum birkaç tanede ek simge ekledim hani kafanıza belki bir şey takılır diye ancak burada çok önemli bir nokta var oda şu gördüğünüz gibi ben Drop And ve Delete Ekledim burası iyi hoş ancak saldırgan adres satırına delete şeklinde yazarsa bu fonksiyonumun hiçbir özelliği kalmak unutmayın ki string değer taşırken büyük küçük harfe duyarlıdır varın gerisini siz düşünün onun için oturup ta ne kadar sql işlem komutu varsa onları fonksiyona dahil etmek yerine ana işleyicileri iptal etmek en akıllıca sı bu fonksiyonu yazdık dan sonra şimdi rahatlıkla adres satırından değerimizi çekebiliriz



sayi = security(request.querystring("sayi"))



burada sayinin getirdiği değeri security fonksiyonumuza okutuyoruz ve ondan sonra sayi değişkenmize eşitliyoruz bunun yanında gereksiz ek kodlara gerek yok fazlada abartmanın manası yok ama seçim sizin her şeyi bilin ama isterseniz kullanın



Gelelim daha detaylı kısımlara yani üyelik sistemlerine aslında anlatacaklarım sadece üyelik sistemlerinde değil alış veriş sistemlerinde de kullanılan işlemler. Bu tarz yazılımlarda yukarıda bahsettiklerimin haricinde daha detaylı olarak cookieler ve sessionlar da kullanılıyor

Haliyle sistemin daha da iyi analiz edilmesi ve de kullanılan güvenliğin artması gerekiyor . Hemen kısaca cookileri ve de sessionları anlatayım . Cookiler kullanıcılın makinasına yazılımınız tarafından oluşturulup browser aracılığı ile yerleştirilen anlık yada uzun zamanlar kalması istenilen küçük veri depolarıdır . Bunlar isteğe göre kullanıcının pc sinde barındırılan ufak kurabiyelerdir diyebiliriz . İşlevleri hayal gücünüze kalmış bir şey . Sessionlar ise yani oturumlar ise internetin temelinde yer alan terimlerden bir tanesidir . Bir kullanıcı bir siteye girdiğinde ister kodlayın isterseniz kodlamayın ona bir oturum numarası yani session number verilmektedir . İşte biz burada verilen bu numarayı okuyacağız ve kullanıcımızı takip etmekten tutunda işlemlerini daha güvenli yapması için session numarasına göre ona özel tüneller oluşturmayı inceleyeceğiz . Ama öncelikle cookiler yani ufak tatlı kurabiyelerimiz



Şimdi sizlere öncelikle cookileri daha sonrada sessionları anlatacağım peşinede güvenli bir login sisteminin güvenlik kodlamasını yapacağız bunun sonunda da isterseniz yazdığınız bir giriş & üyelik sistemini yada veri sisteminin güvenliğini sağlayacaksınız .



Şimdi bir giriş sistemi hazırladınız cookiler nerede işinize yaracak . burası önemli çünkü sırf cookie kullanmış olmak için cookie kullanmaya gerek yok hem vakit hemde emek kaybı



Cookilerin bir sistemde kullanım alanı her zaman dediğim gibi sizin hayal gücünüzün sınırlarına kalmış bir şey bence de sınırı yok Bir ziyaretçinin yada bir üyenin sisteminize girdiğinde hatırlanması konusunda günümüzde çokça kullanılıyor bu durum aslında çokta güzel ancak güvenlik zaaflarına sebep oluyor burada biraz phpye dalmamız lazım phpnin geniş kütüphaneleri sayesinde aspnin yapamadığı bir çok şeyi yada eklentiler ile yaptığı bir çok şeyi yapabiliyorsunuz haliylede phpde port yönetimlerine kadar geniş bir yelpaze meydana geliyor burada hazırlanan basit php yazılımları ile basit ama sinsice bir cookie çalma aracı meydana getirilebiliyor bu durum temelde ie nin açıklarından kaynaklanıyor ve olayın sonucunda girmiş olabileceğiniz bir web sayfası yüzünden pcnizdeki herhangi bir cookie başka bir kişiye yada kişilere anında yollanıyor ve sizin kullanım hakkınız olan sayfalara girme hakları elde ediliyor tabiki burada girmiş olduğunuz sayfanında önemi büyük her sitenin cookiesi çalınamıyor tabiki burası ayrı bir konu iyi bir sistemde cookie çalınması gibi bir durum söz konusu olmuyor . Yukarıda anlattığım basit örnek gibi bir sürü örnek verilebilir her neyse eee bu kadar büyük sorunlara neden olabilecek ancak bir o kadarda işe yarayan cookieleri kullanıyorsak nasıl kullanmalıyız



Şimdi arkadaşlar bir cookie hazırlatacaksınız cookiede nelerin tutulacağına iyi karar vermelisiniz yani direk user ve pss. bulunduracanığınız bir cookie hiçte hoş olmaz aynı zamanda basit olur . bir net cafeden düşünsenize yüzlerce cookie alabilirsiniz . sizin kullanıcınızında bunlardan biri olabileceği muhtemeldir . O zaman cookiede direk user ve pss. tutmak yerine tutacağınız verileri farklı tanımlar ile tutabilirsiniz örneğin şifreyi tutmazsınız da sadece user ve kullanıcının yetkisini belirten bir değer bırakabilirsiniz ancak buradada bir sürü sorun meydana gelebilir .Birde cookileri zaman aralıklarına göre tanımlayabilirsiniz istediğiniz sürede silinmesini yada zaman vermeden tarayıcı penceresi kapatılmasının ardından silinmesini sağlayabilirsiniz. Her neyse cookileri bu kadar incelemek kafi bence zaten güvenlikleri sağlarken bu konuya daha detaylı değineceğim . Ama cookilerin Asp sayfalarında nasıl oluşturulduğunu nasıl okunduğunu hemen göstereyim



Response.Cookies("vampire")="True"



şeklinde bir cookie yaratabilirsiniz bu cookienin içinde sadece true yazısı bulunacak yada daha komplike bir cookie yapabilirsiniz mesela



Response.Cookies("Turx")("vampire")="True"



Burada yaptığım ise turx isminde bir cookie oluşturmak vede vampire ismine true değerini atamak işlevi aynı fark olarak diyelim aynı alt yapı ile farklı sistemler yazdınız aynı anda ikisinede girmeye çalıştığınızda cookie tanımlamaları aynı olduğu için her iki sistemde de işlevleriniz karışacaktır ancak farklı isimler verdiğiniz zaman herhangi bir sorun çıkmayacaktır ayrıca hazırladığımız cookilerde herhangi bir zaman belirteci bulunmadığından tarayıcı penceresinin kapanması ile cookielerimizde silinecektir bunun yanında cookielere dbnizdeki bir değeride atayabilirsiniz oda şöyle öncelikle db bağlantılarımızı ve tablo bağlantılarımızı yapıyoruz



sql = ("Select * From tablo ")

set Veriler=vampire.execute(Sql)



bağlantımızı sağladıkdan sonra

verimizi çekiyoruz vede cookiemize yolluyoruz



Response.Cookies("Turx")("atanacak_veri_adi")=veri ler("dbdeki_isim")



aslında bu biraz karışık gelebilir birde recordset kullanarak aynı işlemi farklı isimler ile yapayım isteyen istediğini kullansın



Set Control = Server.CreateObject("ADODB.Recordset")

sql = "Select * from tablo"

Control.Open sql,UserLogBag,1,3





Response.Cookies("turx")("vampire")=control("deger ")



bu cookielerimizi okuyup hemen diğer konumuz olan sessionlara geçelim



<%Response.write ""& Request.Cookies("turx")("vampire") & ""%>



şeklinde okuyup sayfanıza yazdırabilirsiniz



burada db bağlantımı vede tablo bağlantımı yaptıkdan sonra ( db bağlantısını herhangi bir ortak db yer tanım dosyası ile yapabilirsiniz burada sadece tablo bağlantısını yapıyorum dbye bağlanıldığını var sayıyorum ) turx isimli cookieyi oluşturup içine vampire isimli bir tanım oluşturup control bağlantı nesnesi ile dbden degerin karşıladığı değeri çekip vampireye eşitliyorum . umarım anlaşılır olmuştur cookilerin kısacık özeti cookieleri bir kitap ile ancak anlatabiliriz aslında ...



Gelelim sessionlara . Yukarıda da anlattığım üzere sessionlar bir ziyaretçinin yada bir kullanıcının server tarafından atanan oturum numarasıdır ki bir çoğunuz bu numaralara tanık olmuşsunuzdur . Görmeseniz bile bir sürü sistemde arka planda veri iletimlerinde bir köprü görevi görmekteler . En güzel yanlarından bir tanesi değerlerin serverda tutuluyor olması ve hazırlayacağınız sistemde herhangi bir şekilde kayıt etmediğiniz takdirde tarayıcı pencresi kapatıldığında siliniyor olmaları örnek olarak diyelim ramstation isimli bir kullanıcı sisteminize girdi server ona yine örnek olarak 3526954 gibi bir session atadı kullanıcı tarayıcı pencresini kapattığı anda bu numara silinir ayrıca sitedeki ziyaretçilerin her birine ayrı ayrı session numaraları atanır ve aynı numara farklı kullanıcılara verilemez . Siz yazılımınızda bu numaraları açığı çıkararak kullanıcınızın ipsinide aldırarak o sessionun hangi işlemleri yaptığını zaman olarakda basit kodlarla görebilirsiniz . Ancak sessionların bundan daha önemli işlevleride var bunlardan bir tanesi her kullanıcıya ayrı bir numara veriyor olmasından dolayı bir veri ekleme düzenleme yada silme işleminde bu numarayı kullanarak gerek bir anda yüzlerce verinin girilmesini engelleyebilirsiniz gereksede tarayıcı haricinde saldırı programları ile formlarınız aracılığı ile saldırıların yapılmasını engelleyebilir yada daha ileri giderek o kullanıcıyı sistemden atabilirsiniz Hayal gücünüze güveniyorsanız sorun yok. örnek olarak hemen session alımını göstereyim detaylı kullanımada ilerleyen sayfalarda geçeceğim



öncelikle session değerimizi yakalamayı öğrenelim bu şekilde session değerini yakalayabilirsiniz yakaladıktan sonra herhangi bir post yada get işleminde kullanabilirsiniz



<%=session.sessionID%>



şimdide örnek olsun diye bir post işleminde onu kullanıma açalım



<form method="POST" action="loggin.asp?vampire=<%=session.sessionID%>" >

artık sessionumuzu görebiliriz vampire tabımız session değerimize eşit durumdadır

Şimdide sessionumuzu basit bir rasgele veri üretici bir kod yazalım vede sonucu hem sayfaya yazdırıp hemde sessiona atayalım oluşacak rasgele verimiz 6 karekter uzunluğunda olsun ve sayı harf ve simgeleri kapsayacak şekilde olsun



<%

For i = 1 To 6 ' For döngüsü ile başlıyoruz

Randomize

bas=33

son=125

rasgele61=rasgele61 + chr(int((son - bas + 1) * rnd + bas))

Next

session("trabzon")=rasgele61 ' sessionumuzu trabzon ismi ile oluşturup rasgele oluşturtuğumuz değerimize

'yani rasgele61 e eşitliyoruz daha sonrada sayfaya yazdırıyoruz

Response.write "<center>"&rasgele61

%>





yukarıda basit olarak 2 şekilde session tanımlamalarını kullandık buradan çıkaracağımız sessionların oturum değeri olduğudur vede yazılımcı tarafından da belirleneceği gibi kendimizinde bir session oluşturabileceğidir ama genelde session olarak serverın oluşturduğu değer kullanılır. Sakın yanlış anlaşılmasın sessionlar sadece server tarafından üretilmez yukarıda biraz daha kolay anlaşılabilir olması amacı ile serverler tarafından oluşturulan session tanımlarını anlattım buradada tanımlamamı biraz daha açarak session un nedemek olduğunu kavratmaya çalıştım . Yoksa sessionlara köprü der geçerdim sessionlarda cookieler gibi bir sürü ara tanım içermektedir vede anlatılması bir kitap alır .





Evt bu kadar session ve cookie işleminden sonra bu makelenin asp bölümünün son kısmına geçelim vede Asp bölümümüzü bitirelim . Yukarıda anlattığım kullanımları dolaylı yada direk olarak birazdan bizlere lazım olacak bunuda bilmenizde yarar var ...



Arkadaşlar bir sisteminiz var ya üye girişi yada üye kayıtı ve girişi yada editör yönetim paneli kısacası veri işlemleri yapılabilecek bir yazılımınız var vede bu sistemde herkesin hakkı dahilinde işlemler yapmasını sağlıyor . Haliyle sisteminizi yetkileri dahilinde herkes kullanmak istemeyecek yada yetkilerini aşmaya çalışacak kullanıcılar olacaktır işte burada ben sizlere bir giriş sistemi tasarlayacağım vede siz bu giriş sisteminden kendinize yeni sistemler oluşturacaksınız yada veri ekleme sistemlerinizi yeniden şematize edeceksiniz . Yani aşağıda anlatacağım mevzu tamamiyle bir login sistemi şeklinde olacak . Bizde sistemimizin güvenliğini nasıl sağlayabileceğiz onu göreceğiz



Şimdi bir üye giriş panelinde temelde var olacak iki form vardır bunlardan biri kullanıcı adının yazıldığı diğeride kulanıcının şifresini yazdığı formlardır bunun yanında isteğe göre başka verilerinde girilerek daha çok sorgu sağlanarak girişlerin kontrol edilmesi sağlanabilir . Tabiki bu söylediklerim her sistemde olacak diye bir kayde yok isteyen istediği gibi yazar .
Öncelikli olarak yapmamız gereken sistemimize başkalarından önce kendimizin saldırması ve güvenlik analizinin yapılmasıdır . Diyelim ki sistemimizde yaptığımız analizlerde sql injection açıkları ek yazılımlar ile brute force saldırı tekniğinin yada aklınıza gelebilecek diğer saldırı şekillerinin hepsi işe yarıyor vede sisteme giriş yapılıyor paniğe gerek yok her şeyin ilacı dünyada var sadece bulmak önemli .





Yapacaklarımızı sıralayacak olursam



Formlarda sınırlamalar yapmak bunlarda gerek karekter sayısının düzenlenmesi

Her oturuma numara vermek yani sessionların kullanımı

Sayfalara süre tanımlamaları Koymak ( Belli zaman aralıkları ile işlem hakkı tanınması )

Güvenlik kodu eklenmesi

Formlara girilen sql injection karekterlerinin yada kodlarının temizlenmesi

Cookielerin Kullanımların gözden geçirilmesi ve cookie kullanım&okuma işlemlerinde revizyonların yapılması

Son olarakta Kullanıcı şifrelerinin kriptolanması



öncelikle formlarımızdan fazlaca karekter girilmesini engellemeliyiz ki bu basit bir olay ancak geçilmeside basit ama ben geçilmesini değilde karekter sınırının konulmasını göstereceğim bu sayede sisteme giriş deneyen kişiler giriş sayfasında belirlediğiniz karekter sayısı dışında karekter girmesini engelleyebilir vede uzun olan sql injectionlardan bir nebze kurtulmuş yada saldırıları yavaşlatmış olabilirsiniz



kullanacağımız kodu yazayım hemen



maxlength="6"



işte kullanacağımız kod bu buradaki sayı değeri kullanıcının girebileceği karekter sayısını belirliyor vede o sayıdan fazla karekter girilmesini engelliyor örnek bir form ile gösterip devam edeyim





<input type="text" name="vampire" maxlength="6" >





yukarıdaki tanımda sizlerinde gördüğü gibi vampire isimli forma sadece 6 karekter girilmesini tanımladım bu basit bir engelleme methodu bunu javasc. ile de yapabilirsiniz vede geçilmeleri gayet basit kaldiki biz basit önlemlerden başlayıp en yukarıya kadar devam edeceğiz .



gelelim her oturuma numara atanmasına vede bunumarayı sorgulatmaya öncelikle bu işlemin yararını anlatayım yukarıda yazmış olduğum saldırı yöntemlerinden bir tanesi olan brute force saldırı yönteminde sisteminize giriş denemeleri yapılarak kullanıcılarınızın şifreleri bulunabilir yada ziyaretçi defteri gibi uygulamalarınıza 5 sn içinde 500den fazla post atılabilir tabiki bu tarz saldrıların meydana gelmesini kimse istemez işte oturum numarasını da sayfamızda veriler ile post ederek basit bir güvenlik kalkanı meydana getireceğiz



hemen başlayalım



öncelikle kullanıcı ve şifrenin yazıldığı sayfada işlem yapacağız



mesela



<form method="POST" action="loggin.asp">



şeklinde bir giriş sorgulama işlemimiz olsun burada formlara girilen veriler post methodu ile loggin.asp karşılaştırılarak sizin kodladığınız mekanizmanın işlemesi sağlansın forma veri girilen sayfamızda yapacağımız işlemimiz oldukça basit



yukarıdaki işleme hemen bir değişken ekleyip o değişkenede session numarasını taşımasını söyleyeceğiz yani



<form method="POST" action="loggin.asp?vampire=<%=session.sessionID%>" >



bunu yaptığınızda artık her işlemde adres satırında loggin.asp şeklinde giden bir sorgu yerine loggin.asp?vampire=546555564

gibi bir şekilde postunuz gidecektir buradaki sayıları salladım o sayıları server kendisi verecek burada yaptığım aslında session nesnesine sessionidyi yani oturum numaramızı eşitlemek onuda bir değişkene atayarak başka bir sayfa adres satırı aracılığı ile taşımak bu işlemi cookiler ile de yapabilir yada numaranın görünmesini basitçe engellemek için gizli formlar aracılığı ilede taşıtabilirsiniz



gelelim loggin.asp ye d.....n kuyruğunun koptuğu yer bu sayfamızda bir if else yapısı kurarak adres satırından gelen değerin vampire değişkenine atatığımız değerin olup olmadığını sorgulayacağız genelde yazılan brute force yazılımları çok komplike diildir tabiki bunlar piyasaya sürülenler için geçerlidir daha komplike olanlarda daha farklı yöntemler uygulanıyor mesela kendi sayfa tarama motoru yazılmış olanlarda var neyse alacağımız güvenlik önlemlerinden sonra hiç birinin bir ehemmiyeti kalmayacak



if else yapımız

if NOT request.querystring("vampire") = session.sessionID then

response.write "<br><br><br><center>Hata !<br><br><center>"

response.write "<center>Session Kayıtları Uyuşmuyor !"

response.end

else

end if



burada vampire değişkenini adres satırından aldırıyoruz vede bir önceki sayfada yaptığımız işlemi aynen tekrarlıyoruz şayet değişkenin taşıdığı değer doğru değilse hata mesajımızı yazdırıyoruz ve sayfadaki sorgulamayı durduruyoruz değer doğru isede herhangi bir şey yapmadan sorgulamaya devam ediyoruz orta düzeyli bir brute force yazılımında yada post atackerlarda sessionlarla ilgili bir şey bulunmadığından saldırı burada kesiliyor haa geçemez demiyor geçsin daha çok engelimiz var
SiHVaR isimli Üye şimdilik offline konumundadır   Alıntı ile Cevapla

Yeni Konu aç Cevapla

Bookmarks

Etiketler
guvenlik, tabanli, web, yazilimlarda


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler Arama
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Güvenlik kodunuzumu unuttunuz? gelin birlikte kıralım CaTLaQ_PReNSeS Temalar &Programlar 0 09-05-2007 09:27
Nokia Güvenlik Kodunu Mu Unuttunuz ? Gelin Hemen Bulalım ! Lider Temalar &Programlar 0 08-13-2007 15:34
Bilgisayar Uygulamalarında Kişisel Güvenlik Muro Anti virüs Programları Ve Pc Güvenliği 0 08-04-2007 19:48
Güvenlik Terimleri..!! Kral23 Full Program Download 0 05-28-2007 10:22

Yeni Mesaj içeriyor   Yeni Mesaj Var  Yeni Mesaj içermiyor   Yeni Mesaj Yok  Forum Kapatılmıştır   Forum kapatılmıştır