ana sayfa > BiliÅŸim Güvenlik, Makale, Php, Web Tasarım, Yazılım > CSRF’den Korunma Yolları

CSRF’den Korunma Yolları

Dünyanın en önemli kurumlarında bile görülebilen (Hotmail, Gmail, Yahoo vs…) CSRF (Cross-Site Request Forgery) güvenlik açığı nedir?, nasıl korunulabilir, alınabilecek güvenlik önlemleri nelerdir ? CSRF’ye biraz göz atalım…

CSRF açıkları genellikle form doÄŸrulamalarında, POST’larda ve GET’lerde görülebilir. Image yoluna aldatma olarak GET metoduyla istenilen query strinler de iÅŸletilebilir. ÖrneÄŸin bir mesaj sistemi yaptık. İlgili kiÅŸilere göre yetki sistemini de ayarladık (moderatörler ve yöneticiler silme, deÄŸiÅŸtirme, onaylama vs.. iÅŸlemlerini yapabilme gibi) diyelim. Normal kullanıcıların iÅŸlem yapmaması için de güvenlikleri aldık diyelim. Gelelim burada CSRF açığından oluÅŸabilecek güvenlik açıklarına…

DeÄŸiÅŸtirme, onaylama, silme olaylarını GET yöntemi ile adresten aldığımızı düşünelim (?P=Delete&Id=146). Bu linke giren yetkili kullanıcılar, veritabanında ki 146. idli veriyi silebilirler (?). Sayfanın içine <img src=”?P=Delete&Id=146“  /> image kodunu yazdıktan sonra, sayfaya giren daha önceden giriÅŸini yapmış yetkili kullanıcılar ilgili iÅŸlemin aynısını yapabilecekler. Farklı bir örnek olarak, bir sayfadan GET yöntemi ile gönderilen verilerinde aynı yöntemi tetikleyeceÄŸi unutulmamalıdır. Bir mail geldi diyelim. KiÅŸi, linke tıklamanızı istiyor. Link boÅŸ bir html sayfası açıp o anda yönlendirme yaparak bu adresi açtığını düşünelim. O tıklayan kiÅŸi yine sisteme giriÅŸ yapmış, ve yetkili kullanıcıysa, yine “Delete” stringini görecek ve silme iÅŸlemi yapılacaktır.

Bu açıktan korunmanın en güvenli ve hızlı yolu, session kontrolü dür.  Db işlemlerinizden hemen önce session kontrolü yaparak, sayfanın oluşturulan session ile mi geldiğini kontrol ettirebilirsiniz.

Php’de örnek vereyim.

//Mesaj inputu poÅŸ ise.
if(empty($_POST["Mesaj"])) {
$_SESSION["anahtar"] = md5(rand(0,9999));
//Random olarak üretilen md5 sessiona atılıyor.

//Form yazdırılıyor.
echo ‘
<form method=”POST”>
<input type=”text” name=”Mesaj” />
<input type=”submit” value=”Gönder” />
<input type=”hidden” name=”token” value=”‘ . $_SESSION['anahtar'] . ‘” size=50″ />
</form>’;
}
//Eğer post işlemi var ve Mesaj değişkeninin içi doluysa
elseif(isset($_POST["Mesaj"])) {
//Sayfadan gelen “token” deÄŸeri oluÅŸturulan session ile aynıysa iÅŸlemler yapılıyor
if( $_POST["token"] == $_SESSION['anahtar'] ) {
echo(“GiriÅŸ BaÅŸarılı<br><br>”) . $_POST["Mesaj"];
$_SESSION['anahtar'] = ”; //SESSIONımızı boÅŸalttık ;)
}
else {
//Gelen değer eşit değilse hatayı bas ;)
die(“DoÄŸrulama Yanlış !!!”);
}
}

Burada sayfa post edilmediyse rand ile oluÅŸturulan md5 i session a atıyor. Sonra input hidden nesnesine oluÅŸturulan md5 atanıyor.Post edildiyse oluÅŸturulan en son session ile, Post’tan gelen inputdaki token deÄŸeri ile karşılaÅŸtırma yapılıyor. EÅŸitse iÅŸleme devam ediliyor. DeÄŸilse iÅŸlem sonlandırılıyor.

Bu sistem hem flood ı önlemekte, hemde gizli olarak farklı yerden gelen POST, GET ve image içinde ki request değerlerinden korumaktadır.

Form doğrulamarında, kodlarla uğraşmam bana hazır bişiler lazım diyosanız da reCAPTCHA sistemini öneririm.

Share and Enjoy:
  • Facebook
  • Twitter
  • Live
  1. ÅŸimdilik yorum yok.
  1. şimdilik geri bağlantı yok