PHP ve Güvenli Kodlama
Uygulama geliştiren geliştiriciler için, uygulamanın en kritik noktası güvenli olmasıdır. Özellikle yazılan uygulama web tabanlı, binlerce, onbinlere ziyaretçisi olan bir site veya uygulama ise güvenlik çok daha kritik bir nokta olmaktadır.
- Unutulmaması gereken nokta güvenliğin hiçbir zaman kesin olmadığıdır. Her zaman yeni güvenlik açıkları çıkabileceğinden dolayı yazılan kodların 100% güvenli olması mümkün olmayabilir. Her zaman ufak güvenlik açıkları çıkabilir.
- Güvenlik ölçülmesi zor bir konudur. Yazılan kodlar her ne kadar doğru gibi gelse de, gözden kaçan noktalar olabilir.
- Geliştirilen uygulamanın “kötü niyetli” kullanıcıların gözü ile incelenmesi doğru bir yöntem olacaktı. Bir nevi, uygulamayı yazan veya test eden kişilerin uygulamanın güvenlik açıkları ile ilgili durumları ortaya çıkarması durumudur.
- Güvenlik, sürekli eğitim gerektiren bir durumdur. Uygulama geliştirenlerin, güvenli kod yazma ve güvenlik açıkları ile ilgili haber ve yazıları takip etmesi gerekmektedir.
- Güvenli kod yazmanın en genel kuralı;
Dışarıdan gelen değerlerin işlenmeden önce filtrelenmesi (Filter Input) ve
Ekrana yazılan değişkenlerin Escape (Escape Output), yani özel karakterlerin (HTML, PHP vs. taglarının) dönüştürülmesi
Web tabanlı uygulama geliştirirken yapılan en büyük hata kullanıcıdan gelebilecek ($_POST, $_GET, $_COOKIE, $_SESSION) değişkenlerin kontrol edilmeden işlenmesidir.
Örnek vermek gerekirse, $_GET ile okunan bir değişkenin doğrudan ekrana yazılması istenmeyen sonuçlar doğurabilir,
<?php
echo $_GET[’sayfa’];
?>
Yukarıdaki basit örnekte,$_GET ile gelen sayfa değişkeni herhangi bir kontrolden geçirilmeden doğrudan ekrana yazılmaktadır. İlgili PHP dosyasını index.php?sayfa=phpinfo(); şeklinde kullanmak istenmeyen durumların oluşmasına neden olabilir. Bu kullanım sonucunda ekrana sistem ile ilgili bilgiler yazılacaktır ki bu istenen bir durum değildir.Yukarıdaki kodun doğrusu aşağıdaki gibdir;
<?php
$sayfa = htmlentities($_GET[’sayfa’]);
echo $sayfa;
?>
htmlentities fonksiyonu ile birtakım özel karakterlerin dönüşümünün yapılması sağlanmıştır. Yukarıdaki yönteme ek olarak $_GET ile gelen değişkenlerin tipleri veyaalması mutemel değerler belli ise ek bir kontrol de eklenebilir.Değişkenlerin değerlerinin uygun olup olmadığının kontrolü içn ctype_alnum(), ctype_alpha() gibi fonksiyonlar vardır. Bu fonksiyonlar ile gelen değişken değerinin içeriğinin kontrolü sağlanabilir.
Aşağıdaki örnekte POST ile gönderilen username değişkeni ctype_alnum fonksiyonu ile kontrol ediliyor ve eğer bu değişkenin değeri alfanumerik yani sadece harf ve ramak içeriyorsa kullanılmaktadır.
<?php$clean = array();
if (ctype_alnum($_POST[’username’])) {
$clean[’username’] = $_POST[’username’];
}
?>
Aşağıdaki örnekte POST edilmiş olan color değişkeni için kabul edilebilir değerler önceden belirlenmiş ve eğer bu değerlerden birine uygun veri gönderildiyse kullanıma alınmıştır;
<?php $clean = array(); switch($_POST[’color’]) { case ‘red’: case ‘green’: case ‘blue’: $clean[’color’] = $_POST[’color’]; break; } ?>
Güvenli kodlama ile ilgili önemli bir nokta da bir php sayfa içerisine başka bir dosyayı dahil ederken gerekli kontrollerin yapılmasıdır daha açık ifade ile çağırılacak dosya parametrik ise, gelen parameterinin belirli bir süzgeçten geçirilmesi ve ona göre dosyanın çağırılması gerekmektedir. Örneğin, $_GET ile gönderilen bir parametreye göre bir dosyanın dahil edildiğini düşünelim, bunun kodu aşağıdaki şekilde olacaktır;
require ($_GET['sayfa'] . “.php”);
Yukarıdaki kullanım son derece tehlikelidir. $_GET[’sayfa’] değişkeni tarayıcı penceresinden değiştirilip harici bir dosyanın php içine dahil edilmesi işten bile değildir. Yukarıdaki gibi bir kullanım yerine, $_GET[’sayfa’] değişkenindeki değerin kontrolü şeklindeki bir kullanım çok daha doğru olacaktır. Şöyleki;
$page = ctype_alnum($_GET[”page”]); switch ($page) { case “sayfa1″: include(“sayfa1.php”); break; case “sayfa2″: include(“sayfa2.php”); break; case “sayfa3″: include(“sayfa3.php”); break; }
Öncelikle $GET[’page’] değeri $page değişkenine kontrol edilerek atılmaktadır, sonrasında da $page değişkeninin alması muhtemel değerlere göre bir include işlemi gerçekleştirilmektedir. Yani yukarıdaki kod ile bir hack sorununun olması mümkün değildir.
Yazılım güvenliği ile ilgili hergün yeni teknik ve çözümler geliştirilmektedir, bu konudaki gelişmeler sürekli devam ettiğinden dolayı kişilerin kendilerini eğitmeleri gerekmektedir. Güvenlik ile ilgili yukarıda bahsedilen konularda dışında başka önemli noktalar da vardır, ancak onlara başka bir yazının konusudur.
