ZARARLI KOD TEMİZLEME
ASP-uyumlu Server dendiği zaman akla ilk gelen Microsoft Internet Information Server, site güvenliği açısından sürekli sınanan ve açığı bulunduğu taktirde MS’un yama programları ile bu açığı giderilen bir sunucu programı olarak bilinir. Bu, IIS’in ve diğer MS ürünü Web sunucu programlarının (MS Site Server ve MS Transaction Server ürünlerinin) “kurşun geçirmez” olduğu anlamına gelmez. Fakat sunucu program üreticisi ne kadar önlem alırsa alsın, sizin sitenize, kulllanıcıların yollayacağı zararlı kodları önlemeye çalışmayacaktır. Bu bir zorunluktur. Sizin için zararlı kod sayılan metin, bir başka Internet sitesi için normal kullanıcı girdisi olabilir. Server programını geliştirenler sizin ne tür girdiyi zararlı sayacağını bilemezler. Bunu siz bilmek zorundasınız.
Son yılların deneyimleri gösteriyor ki, başka yollarla Internet sitenizin kök dizinine ulaşmaya çalışan Hacker tiplerin dışında kalan zararlı kullanıcılar (Hacker özentisi kişiler!), genellikle bir veritabanına gittiğini anladıkları Form bilgilerinin içine Server Side Include (sunucu tarafında çalışacak haricî dosya) içeriği görevini yapacak kod parçacıkları katabilirler. Bu amaçla kullanılabilecek zararlı bir kod şöyle olabilir:
<script language="JavaScript"><!--
function reload() {
self.focus();
document.location.href = "
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
}
setTimeout("reload();", 5000);
// --></script>
Bu kodun bütün zararı, içerdiği veritabanını ASP sayfasının herhangi bir etiketi içinde kullanıldığı taktirde ziyaretçiyi burada yazılı URL’e götürmesi ve buradaki sayfayı Browser’ınızda görüntülemek olacaktır. Acemi Hacker’ın ziyaretçinizi zorla götürdüğü yeni Internet sitesi, sadece içerik bakımından sakıncalı olmayabilir; ziyaretçiniz açısından gerçekten tehlikeli bir alan olabilir; göndereceği çerezlerle (cookie) ziyaretçinin bilgisayarında zararlı işler yapabilir. Ziyaretçi bu tuzağa sizin sitenizde bulunduğu sırada düştüğü için, sorumluluk, en azından manevi olarak, size ait demektir.
Zararlı kodlar genellikle bu örnekte olduğu gibi büyüktür-küçüktür işaretleri, düz ve ters bölü ile kesme işareti içerir. Örneğin bir konuk defterinde ziyaretçimizden ne gibi bilgi istersek isteyelim, yazacağı metinde “<” ve “>” işaretlerinin bulunmaması gerekir. Normal bir mesajda, ancak kod yazarken kullanılan bu işaretlerin yeri olamaz. Hatta daha hassas bir düşünceyle, normal ve kısa bir konuk defteri mesajında tek ve çift tırnak, noktalı virgül satır başı (CR) ve yeni satır (LF) işaretleri de bulunmamalıdır. Eğer normal bir ziyaretçi bu gibi işaretlerle dolu bir mesaj yazmışsa, kötü niyetli kişilere karşı alacağımız önlemlerle bu iyiniyetli mesaj da yazarının verdiği biçimi kaybedecektir. Bir kaç ziyaretçimizin konuk defterine fiyakalı yazılar yazmasını sağlamak için, güvenlikten vaz geçmemek gerektiğine göre, “Kurunun yanı sıra yaş da yanar!” demekten başka bir çare düşünmek kolay değil!)
Daha önceki bölümlerde yazdığımız kodları hatırlıyorsanız (veya kimse bakmazken o sayfaları çevirir bakarsanız!), ziyaretçilerimizin Form yoluyla gönderdikleri verileri iki yolla alır ve bir değişkene yazarız: QueryString ve Request.Form. İşte size bir Internet’te gerçekten kullanılan bir konuk defterinin konuk girdilerini veritabanına işleyen bölümü:
<%
Ad = Request.Form("Isim")
Mektup = Request.Form("MailAdr")
Gorus = Request.Form("Mesaj")
Defter = "INSERT INTO mesaj (Isim, Email, Mesaj) VALUES ( "&" '" & Ad &"' , "&" '" & Mektup &"' , "&" '" & Gorus &"')"
Set Veriyolu = Server.CreateObject("ADODB.Connection")
Veriyolu.Open("DSN=misdefter;")
Set RS = Veriyolu.Execute(Defter)
%>
Tasarımcı, Form’dan gelen üç değişkenin (Isim, MailAdr ve Mesaj) değerini, yeni üç değişkene atamakta ve bunları oluşturduğu SQL INSERT deyimi yoluyla “misdefter” adlı veriye yazdırmaktadır. Tasarımcının dünyayı sadece iyi insanlardan oluşan bir cennet sandığı, kendisini tanımasanız bile, bu koddan anlaşılıyor. Dünyayı cennet yapmak elimizde olmakla birlikte, henüz bütün insanlar bu konuda görüşbirliği içinde olmadığına göre, ziyaretçiden gelen Form değişkenlerini atadığımız yeni değişkenlerin değerlerini elden geçirmeli ve içindeki zararlı kodları ayıklamalıyız, ki sonra misafir defteriniz kevgire dönmesin!
Bu işlemi, sözgelimi yukarıdaki kodun sadece birinci değişkeni (Ad) için yapalım. Buradaki Ad = Request.Form("Isim") satırını atacağız ve yerine şu 14 satırı koyacağız:
Ad = Trim(Request.Form("Isim"))'önündeki sonundaki boşluklari atalım
If Len(ad) Then
'**************** BURADA ISTENMEYEN KARAKTERLERI AYIKLIYORUZ ******************
Ad = Replace(Ad, Chr(10) , "") 'satır başı
Ad = Replace(Ad, Chr(34) , "") 'çift tıarnak
Ad = Replace(Ad, "'" , "") * 'tek tırnak
Ad = Replace(Ad, Chr(13) , " ") 'yeni satır
Ad = Replace(Ad, "<" , " ") * 'küçüktür
Ad = Replace(Ad, ">" , " ") * 'büyüktür
Do While Instr(Ad, " ") * *'iki aralık
*ad = Replace(Ad, " " , " ")
Loop
Ad = Trim(Ad) *'önündeki sonundaki boşlukları da attık mı tamam
End If
Bu kod, Ad değişkenini, VBScript’in kullanılmaya hazır Replace() fonksiyonundan geçirerek, içindeki istenmeyen karakterleri ya yok edecek ya da aralıkla değiştirecektir. Böylece eğer kötüniyetli bir kişi, Form bilgisi olarak bize kod olarak kullanılacak bir takım metinler yollamışsa, kodun ana içeriği yerinde kalmakla birlikte, kod olarak kullanılmasını sağlayacak işaretler yok olacağı için kod düz yazıya dönmüş olacaktır.
ADO Güvenliği ve Hata Mesajları
MS Internet Information Server (IIS) ve diğer Web Server programları, istemcinin siteye gönderebileceği talepleri hem kendi açılarından, hem de işletim sistemi açısından belirleme ve sınırlama imkanı sağlarlar. Windows NT işletim sistemi bakımından Internet ziyaretçisi herhangi bir ağ kullanıcısından farksızdır ve ulaşabileceği sayfalar (dosyalar) ve bu dosyalarla yapabileceği işler, “Internet Kullanıcı Hesabı” denen kullanıcının haklarına bağlıdır. IIS’i kuran Web Yöneticisi, bu hesaba istediği gibi haklar kazandırabilir veya sınırlamalar getirebilir. Burada iki noktayı birbirinden dikkatle ayırmak gerekir:
Web ziyaretçisinin bir Web Sitesi’nde kullanabileceği haklar HTTP kaynakları ile sınırlıdır. İşletim sistemi ile ilgili haklar bunun dışındadır. Fakat ikisinin çakıştığı nokta, özellikle veritabanına dayanan Web sitelerinde, veritabanı dosyasının güncelleştirilmesi sırasında ortaya çıkar. HTTP’nin ziyaretçiye sağlayabileceği bütün okuma-yazma hakları tanınsa bile, işletim sistemi bir veritabanı dosyasının yeniden yazılmasına izin vermeyebilir.
Bunu, önceki bölümlerde veritabanı dosyasını güncelleştirme örneklerini yeniden çalıştırarak sınayabilirsiniz. Kullandığınız veri tabanını sözgelimi Windows Gezgini’nde bulun ve sağ tıklayarak “Salt okunur” hale getirin ve ilgili ASP programını çalıştırın; ODBC hata mesajı verecektir.
Bu noktada Web Tasarımcısı olarak akılda tutacağımız ilke şudur: HTTP izinleri ne olursa olsun, eğer işletim sisteminin izinleri daha kısıtlayıcısı ile, işletim sisteminin dediği olur.
Tasarımcı olarak bunun bize etkisi, genellikle Web sitemize evsahipliği yapan Server işletmecisinin veritabanı dosyalarımıza yazma-okuma izni vermesini sağlamaktır. Web sitesi evsahibi (Hosting) firması, veritabanı dosyasına DSN ayarı yaparken bu izni verecektir. Ancak DSN kaydı yaptırıldığı halde veritabanınız ziyaretçilerinize ODBC hata mesajı veriyorsa evsahibi firmanın yönetimine, veritabanı dosyasının “haklarını” yeniden belirlemesini hatırlatmanız gerekebilir.
Veritabanı ile yönlendirilmiş Web sayfalarımızda en sık aldığımız hata mesajı:
[Microsoft] [ODBC Driver Manager] Data source name not found
olsa gerek. Bu mesaj, veritabanının ODBC’ye tanıtılması ile ilgili işlemde arıza olduğunu gösterir. Ya veritabanı dosyasının sürümü, ODBC sürücülerinin kapsamı dışındadır, ya da ODBC sürücüleri eksik kurulmuştur. Bunu, Windows’un Denetim Masası’nda ODBC Yönieticisi’ni çalıştırarak ve sürücüler sekmesini seçerek denetleyebilirsiniz.
Bir diğer sık alınan hata türü ise 80004005’dir. Bu hatanın bir kaç türü olabilir:
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] The Microsoft Jet database engine cannot open the file ‘(unknown)’..
Bu hata mesajına bir kaç farklı durum sebep olabilir:
1. Internet kullanıcısına veritabanının işletim sistemi düzeyinde yazma-okuma yetkisi verilmemiş olabilir.
2. Veritabanının bulunduğu dizinin işletim sistemi açısından dosya oluşturma ve silme yetkileri yoktur.
3. Veritabanının bulunduğu dizin bir ağ sabit diskinde ise Internet kullanıcısının bu diske erişim hakkı yoktur.
4. DSN oluşturulurken veritabanı salt okunur veya Exclusive olarak işaretlenmiş olabilir.
5. O anda dosyaya Server tarafında InterDev gibi bir Web Tasarım Programı erişiyor olabilir.
6. Sözkonusu Access dosyası, bulunduğu ağda yerel kullanıcıların hizmetine açık olabilir.
Bu sorunların çözümü için ODBC yapılandırma işleminin dikkatle yeniden tekrarı ve özellikle sabit disk izinlerinin gözden geçirilmesi gerekir. Bu hata mesajını evsahibi firmanın bilgisayarından alıyorsanız; Web Server yönetimine yeniden başvurmanız şarttır.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] Couldn’t use the file ‘(unknown)’; the file already in use
Bu hata mesajının tek sebebi veritabanı dosyasının birden fazla kullanıcı tarafından kullanılmasını önleyen kilit deyimlerinin kullanılmış olmasıdır. Çözümü, dosya ile ilgili .Recordset deyiminin kilidi önleyecek şekilde yazılmasından ibarettir.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] Data source name not found and no default driver specified
Veri tabanı ile veri-yolu bağlantısı kuracak Connection komutu, Global.asa dosyasından alınmak isteniyorsa ve IIS Global.asa dosyasını çalıştıramıyorsa bu hata mesajıyla karşılaşırsınız. Global.asa dosyasında şu kodun bulunup bulunmadığını kontrol edin:
<%=”’auth_user’ ise & request.servervariables(“auth_user”)%>
<p>
<%=”’auth_type’ is & request.servervariables(“auth_type”)%>
<p>
<%=”connection string is & session(“baglanti_deyimi”%>
<p>
Burada “baglanti_deyimi ifadesi yerinde sizin Connection deyiminiz yer almalıdır. Global.asa’da bu ifadelerin bulunmasına rağmen yine de çalışmıyorsa, Web Server programına, global.asa’nın içinde bulunduğu kök dizin için çalıştır (execute) izni verilmemiş olabilir. Bu kişisel Web Server’da veya yerel IIS’te oluyorsa, bütün yapacağınız şey kök dizin olan klasörü sağ tıklayarak izinlerini değiştirmektir. Bu hata evsahibi firmanın sitesinde oluyorsa, Web Sitesi yönetimi ile temasa geçmeniz gerekir.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] Data source name not ??
Web Server’ın bulunduğu bilgisayarda MDAC (Microsoft Data Access Component) dosyaları ya bozulmuş ya da yanlış kurup kaldırma yüzünden bazı bileşenleri arasında sürüm farkı doğmuş demektir. MDAC’ın güncellenmesi çözüm sağlayabilir.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access ODBC driver Driver] General error Unable to open registry key...
Registry Editor ile burada adı verilen kayıt anahtarı (Key) için verilen izinlerikontrol etmelisiniz. Bunun için Regedt32.exe programını kullanabilirsiniz.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC SQL Server Driver] [dbnmpntw] ConnectionOpen (CreateFile()).
Aynı bilgisayarda bile olsa SQL Server izinleri yeterli değilse, ODBC sürücüleri veritabaına ulaşamazlar. Sorunu çözmek için SQL Server yönetimiyle görüşmek ve izinleri değiştirmek gerekir.
Bu ve diğer 80004005 hata mesajları için Microsoft’un sitesinde Q189408, Q174943, Q173742, ve Q175671 numaralı bilgi notlarına (Knowledgebase articles) başvurabilirsiniz.
ASP Hatası Arama
ASP teknolojisi, Internet’in kendisine göre nisbeten eski HTTP protokolü ile işbirliği yapmak zorundadır ve bazen ASP sayfalarımızda oluşan hatalar, bizden (yazdığımız VBScript veya diğer Script kodlarından) değil, bu iki teknolojinin Server’daki uyumsuzluğundan kaynaklanıyor olabilir.
ASP teknolojisi üç adımda çalışır:
1. Ziyaretçi bir ASP sayfası talep eder
2. Server talep edilen belgenin bir ASP programı olduğunu belirler ve bunu ziyaretçiye göndermeden önce ASP.DLL aracılığıyla çalıştırır.
3. Ortaya çıkacak olan HTML belgesi ziyaretçiye gönderilir.
Bu bakımdan ASP hatasını ararken sorulacak birinci soru hatanın nerede olduğu olmalıdır. Hata istemci tarafında ise ASP sayfamız muhtemelen ziyaretçinin Browser’ı ile uyumlu olmayan HTML kodu üretiyor olabilir. Ayrıca hatanın hangi aşamada olduğunu yakalamamız gerekir.
Sık alacağımız bir ASP hatası, Server’ın vereceği “VBS Script Error:” şeklinde başlayan mesajlar olacaktır. Bu, gerçekten de sayfamızdaki VBScript kodlarında hata olduğunu gösterir. Yapılacak tek şey, iyi bir programcı gibi, biraz açık havada gezdikten sonra kodu baştan sonra yeniden gözden geçirmek veya en iyisi başka bir programcının yardımını istemektir. Bir süre sonra insan kendi yazdığı kodlardaki hataları göremez hale gelir!
Nesne oluşturma hataları ise “Failed to create ...” diye başlar ve hemen hemen daima ASP sayfanızdaki Server.CreateObject.. diye başlayan deyimin icra edilemediğini gösterir. Bu sizin yanlış nesneye yanlış metod kullandırmaya kalkmanızdan olabileceği gibi, Web Server’ın size bazı bileşen dosyalarına (.dll ve .exe) erişim hakkı vermiyor olmasından kaynaklanabilir. Ücretsiz ASP desteği veren sitelerde çoğu zaman bu tür komutlar içeren Script’lere izin verilmez.