Güvenli PHP Uygulamaları – Cross site scripting(XSS)

Kullanıcının betiklerimize html kodu enjekte etmesiyle ortaya çıkar.
Girdi filtrelenmeden çıktı olarak sunuluyorsa bu saldıya uğranabilir.

Aşağıdaki gibi bir formumuz olsun:

1
2
3
4
<form id="form1" action="" method="post">
<textarea name="mesaj"></textarea>
<input type="submit" value="gönder" />
</form>

Formdaki mesaj alanına aşağıdaki javascript kodunun enjekte edildiğini varsayalım.

1
2
3
<?php 
<script type="text/javascript">window.location = 'http://www.zihni.net' </script>
?>

Girdiyi filtrelemeden, aşağıdaki şekilde ekrana yazdırırsak, sayfaya giren her kullanıcıyı istediğimiz siteye yönlendiririz.

1
2
3
<?php 
echo $_POST['mesaj'];
?>

Yukardaki kodun zararlı etkilerinden korunmak için girdiyi htmlentities() işleviyle filtrelememiz gerekir.

1
2
3
<?php 
echo htmlentities($_POST['mesaj']);
?>

Güvenli PHP Uygulamaları – Kullanıcı Girdilerinin Filtrelenmesi

Kullanıcı girdilerine güvenilmemeli, betiklerimizin güvenliği için
tüm girdiler filtrelenmelidir.

Örneğin kullanıcıdan yaş bilgisini isteyelim:

Kullanıcıdan beklenen girdi, sayı türünde bir değerdir.
Aşağıdaki kod bu doğrulamayı yapar.

$sonuc = preg_match("/[0-9]{1,3}/",$_POST['yas']);
if($sonuc === true)
echo "Girdi doğrulandı";
else
echo "Girdi sayı değil";

Kullanıcının hayat hikayesini istediğimizi varsayalım, yukardaki gibi bir basit bir doğrulama yapamayız, bunun yerine php nin bize sunduğu temel filtreleme işlevlerinden yararlanabiliriz.
Html tagları sorunlara yol açabilir.
stript_tags() işlevi html etiketlerini yok eder.

$girdi = "<h1>büyük bi başlık</h1><span>span etiketi</span>";
echo strip_tags($girdi);

Yukardaki örneğin çıktısı:

büyük bi başlık span etiketi

Bazı etiketlere izin vermek istiyorsak:

$girdi = "<h1>büyük bi başlık</h1><span>span etiketi</span>";
echo strip_tags($girdi,"<span>");</span>

Yukardaki örneğin çıktısı:

büyük bi başlık <span>span etiketi</span>

htmlentities() işlevi tüm html karakterlerini html entitilerine çevirir.

$girdi = "<h1>büyük bi başlık</h1>";
echo htmlentities($girdi, ENT_QUOTES,'UTF-8');

yukarıdaki örneğin çıktısı:

&lt;h1&gt;büyük bi başlık&lt;h1&gt;