PHP ile Güvenlik Önlemleri
PHP site yaparken güvenlik açıkları bırakmak tüm çaba ve emeklerinizin yok olmasına neden olabilir. Öyle ki bu şekilde terör örgütlerinin saldırısına uğrayarak mahkemelik olan websiteler bile duymuşsunuzdur. İşte biz bu yazımızda size bu açıklardan ve bu açıklara karşı alınacak önlemlerden bahsedeceğiz.
Cross Site Scripting (XSS) Açığı
Web sitelerimiz, deyim yerindeyse javascript ile birlikte hayat bulmuştur. Bu, kullanıcı bazlı cpu kullanımı ve anlık etkileşimini bantwidth zorlamadan sağlanması, webmasterları javascript kullanmaya itmiştir. Tabii bu da ardından sorunlar getirmiştir. İşte bu hata da o sorunlardan birisidir. Kullanıcı etkileşimli bir alanda, örneğin bir searchbox kutusunda, javascript ile bırakılan bir XSS açığı var ise, siteniz tehlikede sayılır.
Örnek olarak
<?php
$a = $_GET[“komut”];
echo $a;
?>
Burada $_GET[] ile alınan değer kontrol edilmeden alınmış. Yukarıda index.php?komut=selam yazılırsa ekran selam yazısı çıkar.
Eğer parametreyi şu şekilde yaparsak açığı kullanabiliriz.
?komut=<script>alert();</script>
Alert içerisinde session, cookie bilgilerine erişebilir ve kullanıcı bilgilerini çalabiliriz. Bu açığı kapatmanın yolu ise çok kolay. Ekrana yazarken htmlspecialchars fonksiyonu ile yazarsak, html ifadelerine karşı koruyucu önlem almış oluruz.
2: SQL İnjection Açığı
Bu açık PDO ile birlikte az çok önlenebiliyor. Ancak tedbiri elden bırakmadan kod yazmakta sakınca yok. SQL injection açığı genelde sql kod içerisinde müdahele edecek şekilde sorgunun değiştirilerek çıktı üretilmesine verilen addır. Bu kod ile hacker, veritabanına delete komutu yollayabilir, ya da şifresini bilmediği kullanıcının hesabına giriş yapabilir. Hotmail gibi bir site bile bir zamanla böyle bir açık bırakmış. Bu açığın keşfedilmesi de kapatılması da zahmetlidir. Her sorgu için tek tek yazmak gerekebilir. Bu yüzden veri tabanı fonksiyonlarını ortak bir class ile yöneterek önlemleri topluca uygulamakta mümkündür.
Aşağıdaki kod ile injection açıklarını topluca kapatmanız mümkündür.
function veriTemizle($mVar){
if(is_array($mVar)){
foreach($mVar as $gVal => $gVar){
if(!is_array($gVar)){
$mVar[$gVal] = htmlspecialchars(strip_tags(urldecode(mysql_escape_string(addslashes(stripslashes(stripslashes(trim(htmlspecialchars_decode($gVar))))))))); // -> Dizi olmadığını fark edip temizledik.
}else{
$mVar[$gVal] = veriTemizle($gVar);
}
}
}else{
$mVar = htmlspecialchars(strip_tags(urldecode(mysql_escape_string(addslashes(stripslashes(stripslashes(trim(htmlspecialchars_decode($mVar))))))))); // -> Dizi olmadığını fark edip temizledik.
}
return $mVar;
}
$_GET = veriTemizle($_GET); // -> GET verilerini temizledik.
$_POST = veriTemizle($_POST); // -> POST verilerini temizledik.
$_SESSION = veriTemizle($_SESSION); // -> SESSION verilerini temizledik.
$_COOKIE = veriTemizle($_COOKIE); // -> COOKIE verilerini temizledik.
Bu şekilde get ve post ile bize iletilen veriler içerisinde kirli kod bulunuyorsa, bu kod etkisiz hale getirilir ve site güven içerisinde yayına devam edebilir.