Güvenli PHP Uygulamaları – Formların Güvenliği

Betiklerimize istemediğimiz yerlerden form verilerinin gönderilmesiyle ortaya çıkar.

Aşağıdaki gibi bir formumuz(form.php) olsun:

<form action="formIsle.php" method="POST">
	<input type="radio" name="medeniHali" value="bekar" checked="checked">
	<input type="radio" name="medeniHali" value="evli">
	<input type="radio" name="medeniHali" value="dul">
	<input type="submit" value="Gönder" />
</form>

Bu formu işleyen sayfamız(formIsle.php) ise aşağıdaki gibi olsun, formdan gelen medeni hali bilgisini yazdırıyor.

1
2
3
4
<?php
echo $_POST['medeniHali'];       
// Çıktı: bekar
?>

Saldırganın aşağıdaki formu(form.php) kendi bilgisayarından gönderdiğini varsayalım. Formun action özelliğine tam adresi yazıyor.

1
2
3
4
<form action="http://www.siteadresi.com/formIsle.php" method="POST">
	<input type="text" name="medeniHali" value="yalancı">
	<input type="submit" value="Gönder" />
</form>

Form işleyen(formIsle.php) sayfamız yukarıda gönderilen formu işler.

1
2
3
4
<?php
echo $_POST['medeniHali'];
// Çıktı: yalancı
?>

Medeni hali, bekar-evli-dul değerlerinden birini alması gerekirken, “yalancı” diye bir değer almıştır.

Bunu önlemek için tek kullanımlık bir şifre oluşturulabilir:

1
2
3
4
5
6
7
8
9
10
11
<?php 
$formAnahtar = rand(10000,1000000);
$_SESSION['formAnahtar'] = $formAnahtar;
?>
<form action="http://www.siteadresi.com/formIsle.php" method="POST">
	<input type="radio" name="medeniHali" value="bekar" checked="checked">
	<input type="radio" name="medeniHali" value="evli">
	<input type="radio" name="medeniHali" value="dul">
	<input type="hidden" name="formAnahtar" value="<?php echo $formAnahtar; ?>">
	<input type="submit" value="Gönder" />
</form>

Formu işleyen(formIsle.php) sayfamız:

1
2
3
4
5
6
7
<?php
 
if($_SESSION['formAnahtar'] == $_POST['formAnahtar'])
	echo $_POST['medeniHali'];
else 
	echo "Bu form başka bir yerden geliyor.";
?>