Selam dostlar, şuan popüler olarak kullanılan birçok uygulamada CSRF engelleme özelliği bulunuyor. Ben size yine de eski bir proje ilavesi yapacağım. Eğer siz de kendiniz basit bir şeyler yazmak isterseinz diye basit bir örnekle durumu size anlatacağım. Bu örnekte bir oturum özelliğinin olduğunu dolayısıyla oturum açmayı başarıyla gerçekleştirmiş bir kişiyi örnek alacağız. Kullanıcının erişebilir olduğu formu CSRF olarak kabul edeceğiz ve CSRF önlemi için içine dahil edeceğiz. Uygulama index.php, msg.php ve msg_insert.php dosyaları olsun.
index.php komut yapısı şu olsun;
<html>
<head>
<meta http,equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CSRF Denemesi</title>
</head>
<body>
<?php
session_start();
?>
<b> CSRF Test Yeri : </b>
<ul>
<li><a href="msg.php">Forum Örnek</a></li>
<li><a href="link.php">Link Örnek</a></li>
</ul>
</body>
</html>
index.php'yle msg.php sayfasına ulaştık ve bunun da içeriği şöyle olsun;
<?php
session_start();
$token = md5(time()*(1/rand()));
$_SESSION['token'] = $token;
?>
<form action="msg_insert.php" method="post">
Mesaj : <textarea id="mesaj" name="mesaj" rows="2" cols="27"><textarea>
<imput type"hidden" name="token" type="hidden" value="<?php echo $token; ?>"/>
imput type="submit" value="submit">
</form>
Fark ettiniz mi bilmem ama $token değişkeni rastgele ve tahmini zor bir sabit tanımlıyor.Bu da ilgili forma hidden field olarak işliyor. Aynı zamanda $_SESSION['token'] olarak da otuyum bilgisine işliyor. Nedeni bu formda gönderilecek olan $token değeri daha sonra $_SESSION içinde saklanan değer ile kıyaslanacak. Sonra mesaj yazılan ekranda yazı olarak mesaj gönderim işlemi yapacak.
Bu işlemi algılayacak olan msg_insert.php kodu da şöyle;
<?php
session_start();
$mesaj = $_POST['mesaj'];
$token = $_POST['token'];
if ($token == $_SESSION['mesaj']) {
echo "bunu göreceksin : $mesaj";
unset($_SESSION['token'];
}
else {
echo "Hocam sorun var, Saldıran Oc Sen misin?";
}
?>
burada görüldüğü gibi formdan gelen token değeriyle SESSION içerisinde olan token değeri eşitse bu formdan veya kullanıcıdan geliyor demek. Gelmiyorsa CSRF saldırsı var demektir.
Bu tür yazılan CSRF önlemlerinde dikkat edilmesi gereken şeyler;
token olarak belirtilen değişkenin tahmin edilemez olması
oluşturulan tokenden sonra sessiondan çıkarmalısınız
her formdan sonra yeni token eklenmeli ve refreshde yeni token gelmeli
kritik işlem arz eden formlar kullanılan tokenin yanına kalıcılık yani yaşam süresi eklenmeli
$SESSION['mesaj_from']['token_time'] = time();
daha sonra doğru yerde şimdiki zamanınfarkını alıp belirli bir süre üzerindeyse izin verilmemesi doğru bir düşünce olacaktır.
[/HIDE]
index.php komut yapısı şu olsun;
<html>
<head>
<meta http,equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CSRF Denemesi</title>
</head>
<body>
<?php
session_start();
?>
<b> CSRF Test Yeri : </b>
<ul>
<li><a href="msg.php">Forum Örnek</a></li>
<li><a href="link.php">Link Örnek</a></li>
</ul>
</body>
</html>
index.php'yle msg.php sayfasına ulaştık ve bunun da içeriği şöyle olsun;
<?php
session_start();
$token = md5(time()*(1/rand()));
$_SESSION['token'] = $token;
?>
<form action="msg_insert.php" method="post">
Mesaj : <textarea id="mesaj" name="mesaj" rows="2" cols="27"><textarea>
<imput type"hidden" name="token" type="hidden" value="<?php echo $token; ?>"/>
imput type="submit" value="submit">
</form>
Fark ettiniz mi bilmem ama $token değişkeni rastgele ve tahmini zor bir sabit tanımlıyor.Bu da ilgili forma hidden field olarak işliyor. Aynı zamanda $_SESSION['token'] olarak da otuyum bilgisine işliyor. Nedeni bu formda gönderilecek olan $token değeri daha sonra $_SESSION içinde saklanan değer ile kıyaslanacak. Sonra mesaj yazılan ekranda yazı olarak mesaj gönderim işlemi yapacak.
Bu işlemi algılayacak olan msg_insert.php kodu da şöyle;
<?php
session_start();
$mesaj = $_POST['mesaj'];
$token = $_POST['token'];
if ($token == $_SESSION['mesaj']) {
echo "bunu göreceksin : $mesaj";
unset($_SESSION['token'];
}
else {
echo "Hocam sorun var, Saldıran Oc Sen misin?";
}
?>
burada görüldüğü gibi formdan gelen token değeriyle SESSION içerisinde olan token değeri eşitse bu formdan veya kullanıcıdan geliyor demek. Gelmiyorsa CSRF saldırsı var demektir.
Bu tür yazılan CSRF önlemlerinde dikkat edilmesi gereken şeyler;
token olarak belirtilen değişkenin tahmin edilemez olması
oluşturulan tokenden sonra sessiondan çıkarmalısınız
her formdan sonra yeni token eklenmeli ve refreshde yeni token gelmeli
kritik işlem arz eden formlar kullanılan tokenin yanına kalıcılık yani yaşam süresi eklenmeli
$SESSION['mesaj_from']['token_time'] = time();
daha sonra doğru yerde şimdiki zamanınfarkını alıp belirli bir süre üzerindeyse izin verilmemesi doğru bir düşünce olacaktır.
[/HIDE]
Bu içeriği görmek için giriş yapın.
Moderatör tarafında düzenlendi: