CSRF (Cross Site Request Forgery) saldırıları günümüzde halen bir çok script te mevcut olup kesinlikle kapatılması gereken bir açıktır.
Bu açık GET ve POST edilen değerlerin kullanıcı izni olmadan (ya da kullanıcı istemeden) yapılmasıyla oluşur.
Ben bu yazımı GET metodu kullanılarak yapılan işlemler hakkında yazacağım
Daha açık anlatmak gerekirse örneğin bir banka hesabına sahip kişi herhangi birine para göndermek istediğinde formdan kişi adını ve miktarını ve para birimini girer.
Bunu querystring e dökersek şöyle bir şey ortaya çıkar


bilisimbank.com/userpanel/index.php?action=moneytransfer&to=admin@bilisimtur k.org&amount=1000&currency=American Dollar

Yukarıdaki kod bir kullanıcı para transfer etmek istediğinde yapılan işlemlerdir.
Peki biz bu linki kendimize göre düzenleyip karşı tarafa bir şekilde bu işlemi yaptırırsak ne olur ?
Karşı tarafın haberi olmadan onun hesabından istediğimiz hesaba para aktarmış oluruz.

İşte bu yüzden GET ve POST ettiğimiz değerlerde normal verilerin yanında sadece bize ait olan bir veri daha göndermeliyiz.
Bu session_id olabilir veya ilk defa oturum açıldığında herhangi bir sessiona unique id vererek bu id yi kontrol ederek olur.
Ben csrf saldırıları önlemek için session id yi kullanacağım.
Bir formum olacak ve bu formdan para gönderilecek kişiyi ve miktarı alacağım.Ve csrf önlemi olarak da hidden bir inputta session id yi tutup gönderdiğim sayfada bu session id yi kontrol edeceğim.

Formum şöyle


<?php ob_start();
session_start();
function token(){// burada bir fonksiyon oluşturdum ve session id yi return ettim
    $token= session_id();
    return $token;
 
}
 
$_SESSION["giris"]=token();
 
?>
 
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<style>
    #temizle{clear: both}
</style>
 
<title> </title>
</head>
 
<body>
    <form action="sec.php" method="GET">
<div id="wind">
 
<div id="forms">
<div id="tsol">Para gönderilecek kişi</div><div style="float:left"><input type="text" name="isim"  id="texts"></div><div id="temizle"></div>
<div id="tsol">Miktar</div><div style="float:left"><input type="text" name="miktar" id="texts"></div><div id="temizle"></div>
<input type="hidden" name="token" value="<?php echo token(); ?>">
 
    <div id="tsol">&nbsp;</div><div style="float:left"><input type="submit" value="Gönder" > </div><div id="temizle"></div>
 
</div>
 
 
</div>
</form>
</body>
</html>
Ve değişkenleri Get ettiğim sec.php dosyası ise şöyle

<?php ob_start();
session_start();
 
 
$kisi= @strip_tags($_GET["isim"]);
$miktar=@strip_tags($_GET["miktar"]);
$token=strip_tags($_GET["token"]);
 
if($token!=$_SESSION["giris"] || $token==null ){ //eğer form.php den gelen hidden value ile session id örtüşmüyorsa 
//csrf saldırısı algılandı diye çıktı verecek ve uygulamadan çıkacak
    exit("Csrf saldırısı algılandı ! ");
     
}
 
else{
    echo " Bilgi transferi güvenli bir şekilde gerçekleşti ";
}
 
?>
kaynak:http://bilisimturk.org/forum/Php-Csr...olları-konusu