"Session Hijacking" Nedir? Nasıl Önlenir?
"Session hijacking" kelime anlamı olarak "oturum çalmak" demektir. Kullanıcı bir siteye girdiğinde, her sayfada tekrar giriş bilgilerinin sorulmaması, $_SESSION ve $_COOKIE değişkenlerince taşınan veriler sayesinde sağlanır. $_COOKIE(çerez) kullanıcı bilgisayarına gönderilirken, $_SESSION sunucuda kalır. Bu bilgiler el değiştirirse, sizin nüfus cüzdanınız artık bi başkasının elindedir ve sizin yerinize iş yapabilir demektir.
Çerezler kullanıcı bilgisayarı aracılığı ile yönetilir demiştik. Her kullanıcı sizin sunucunuz kadar güvenlik tedbiri almayabilir dolayısıyla bu verilere sizin kadar sahip çıkamaya da bilir. Eğer sitelerinizde javascript gibi hash çalabilen kodlara izin veriyorsanız, siz de kullanıcının bilgilerini çaldırmasına yardım etmiş olursunuz ve kullanıcı çerezlerini çaldırdığında içinde kullanıcı adı ve şifresinin kriptolanmış hallerinin olması asla çözüm olmayaz. Şöyle ki;
A Kişisi için çerez kullanici: seyranli,sifre: a231a31232a23123a213
olsun. Bu çerezi biz hangi bilgisayara atarsak, A kişisi o bilgisayarda giriş yapmış olarak görünür. Buraya kadar olan kısım cookie spoofing olarak geçiyor.
Spoofing belasıyla uğraşmak istemeyen arkadaşlar da bunun yerine $_SESSION kullanıyor ki, kullanıcı bilgileri çalınamasın. Gözden kaçırılan ise, $_SESSION takibi için kullanılan session id(oturum numarası) iyi korunamıyor. Session id ya sayfalarda index.php?SESSID=asdqweasd123 şeklinde ya da kullanıcı bilgisayarındaki bulunan çerezler aracılığyla taşınır. O halde;
A kişisi için session dosyası kullanici: seyranli,sifre: a231a31232a23123a213
ve
A kişisinin çerezindeki veya adres satırındaki bilgi SESSID=asdqweasd123
olsun. A kişisinin oturum numarasını bulan her kişi sanki A kişisiymiş gibi kendini sistemimize tanıtabilir. Bu da bir session hijacking örneğidir.
Session hijacking bir de ortak kullanılan sunucularda session dosyalarının ortak bi dizinde tutulmasıyla olur. Biraz daha zor olan bu yöntemde ise direk olarak session dosyalarının içeriği yer değiştirir. A kişisinin sessionı olan kullanici: seyranli,sifre: a231a31232a23123a213 satırlarını kendi session dosyasına kaydeden aynı sunucudaki başka bir site sahibi artık bizim sitemizdee A kişi olarak hareket eder. Bu da başka bir oturum çalma örneğidir.
neresinden baksak başka bi derdi çıkıyor bu oturumun ama hiç biri çözümsüz değil. Farklı çözüm yolları üretilebilir. Örneğin şifre hashi olarak, tarayıcıyı ve ip adresini de ekleyebiliriz.
if($_SESSION['sifre']!='' && $_SESSION['sifre'] != md5($sifre. $_SERVER['REMOTE_ADDR']. $_SERVER['HTTP_USER_AGENT']) { }
görüldüğü üzere, yeterince sağlam bir yoldur. Artık kullanıcının oturumunu çalacak kişi mecburen aynı tarayıcı kullanmalı ve aynı ağda olmalıdır. Eğer ki session dosyalarınızın küçük boyutlarda olmasını istiyorsanız veya oturumları daha rahat yönetmek istiyorsanız bir de veritabanı kullanmanızı tavsiye ederim.
ip, session_id ve tarayici alanlarından oluşan bir tablo vasıtası ile session kontrol edilebilir.
$sorgu=mysql_query("SELECT session_id,tarayici FROM oturum WHERE ip='".$_SERVER['REMOTE_ADDR']."'"); if( ($veri['session_id']!='' && $veri['session_id']!=session_id() ) || ($veri['tarayici']!='' && $veri['tarayici']!=$_SERVER['HTTP_USER_AGENT'] )) { }
şeklinde önlem alabilirsiniz.
Sürekli olarak anahtar değiştirerek güvenliğinizi artırabilirsiniz. session_start(); satırından sonra hatta alta bile geçmeyin hemen yanına "session_regenerate_id();" kodunu ekleyin ve anahtarınız tekrar üretilsin. Eski veriler bu haldeyken silinmez çünkü varsayılan şekli böyledir, ama eşşeğinizi sağlam kazığa bağlamak isterseniz "session_regenerate_id(false);" olarak da kullanabilrisiniz.
Oturum bilgileri dosya olarak tutuluyorsa(varsayılanı böyledir) dosya adında, veritabanı kullanıyorsanız yine kendine göre yerlerde değişiklik yapılacağından çok fazla tekrar üretim, sunucuya yine ek yük bindirecektir.
Sonuç olarak tavsiyelerim şunlardır;
- Çerez veya session, hangi yöntemi kullanırsanız kullanın muhakkak hash içerisine kullanıcıdan kullanıcıya değişen özellikler ekleyin.
- Session kullanıyorsanız session.save_path değerini değiştirin.
- Her sayfada oturum bilgilerinin doğruluğundan emin olun. Eğer oturum açıksa kontrol fonksiyonunu çalıştır şeklinde bir mantık kurup, yukarıdaki kodlardan faydalanarak kontrol fonksiyonu yazın.

