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']);
?>

2 Yorum

  1. enver diyor ki:

    ben kullanıcıların giriş yaptıkları formlardan gelen verileri ekte verdiğim fonksiyon ile kontrol ettiriyorum, zararlı kodları temizlemek için birebir.
    http://tinypaste.com/92023

  2. Erkan Aksu diyor ki:

    htmlentities() fonksiyonu Türkçe karakter problemi çıkaracaktır bu sebeple fonksiyonda karakter kümesi parametresini belirtmemiz gerekiyor. Şu şekilde yazalım.
    htmlentities($_POST['mesaj], ENT_QUOTES, ‘UTF-8′);
    ENT_QUOTES sabiti çift tırnaklar ve tek tırnaklarıda dönüştürmek için kullanılır.
    Veya ENT_COMPAT ile yanlızca çift tırnakları dönüştürebilirsiniz. Eğer hiçbiri dönüştürülmeyecekse ENT_NOQUOTES sabiti kullanılır. Ayrıca ‘UTF-8′ karakter kümesi isteğe bağlı parametresini yazabilmemiz için diğer öncesindeki yine isteğe bağlı sabitlerden birini yazmamız mecburi olacak bu zaten tüm fonksiyonlar için geçerlidir.
    Eğer isteğe bağlı parametreleri belirtmezsek öntanımlı olarak ENT_COMPAT sabiti ve ISO-8859-1 karakter kümesi geçerli olacak.

Yorum Yaz