CSRF’den Korunma Yolları
May 28
Bilişim Güvenlik, Makale, Php, Web Tasarım, Yazılım csrf, csrf açıkları, csrf den korunma, csrf nedir 3 Yorum
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.
Okunma: 15
RSS
Twitter
FriendFeed
KodHatası !