Selam Arkadaşlar,
Bu konuyu açma amacım güvenlik konusunda herkes kullandığı fonksiyonları paylaşması amaçlıdır. Her farklı işlemde farklı güvenlik önlemleri alınır, Eğer tek bir ugulama önlemi almaya kalkarsanız bu istenmeyen bug lara sebebiyet verebilir. Örneğin:
  $orig = "Selam ben <Lisans>\n ' Selamlar nasılsınız? '";
$a = htmlentities($orig);
$b = htmlspecialchars($a);
 echo $a; // Selam ben <Lisans>  ' Selamlar nasýlsýnýz? '
 echo $b; // Selam ben <Lisans>  ' Selamlar nasılsınız? '
Gördüğünüz gibi kelimemizi htmlentities'ten geçirince "<",">" gibi kelimeler html kod'a döndü fakat türkçe karakterler bozuk çıktı ancak aynı yerde htmlspecialchars kullanınca türkçe karakter sorunu ortadan kalktı.Bizde bu konuda nerede nasıl güvenlik önlemi almalıyız onu tartışalım ve paylaşalım herkes'e yararlı olacaktır eminim.

Örneğin Text tip'inde bir input'umuz var bundaki verileri süzmek için
<?php
$veri = "Selam ben <Lisans>\n ' Selamlar nasılsınız? '";
echo htmlentities($veri);
#Çıktı: Selam ben <Lisans>  ' Selamlar nasýlsýnýz? '
?>
Html karakterleri normal hale getirecektir. Fakat türkçe karakterlerde sorun çıkartmaktadır buda bir bug'dır. Bunun yerine
<?php
$veri = "Selam ben <Lisans>\n ' Selamlar '";
echo htmlspecialchars($veri);
#Çıktı: Selam ben <Lisans>  ' Selamlar nasılsınız? '
?>
Kullanırsak türkçe karakterlerde düzgün gözükecektir.

Eğerki textarea'dan veri alıyorsak bu önlemler yine bug yaratacaktır ve ne kadar enter ile alt satıra geçilsede veriyi dümdüz veritabanına gönderecektir.O yüzden bu zamanda nl2br kullanırız. Fakat burada sıra çok önemlidir sıralama hatasıda istenmeyen bug'lara sebep olabilir.
 <?php
 $veri = "Selam ben <Lisans>\n ' Selamlar '";
echo htmlspecialchars(nl2br($veri));
#Çıktı: Selam ben <Lisans><br />  ' Selamlar nasılsınız? '
 ?>
Fakat sıralamayı şu şekilde yaparsak istenmeyen hatalardan kurtulabiliriz.
  <?php
  $veri = "Selam ben <Lisans>\n ' Selamlar '";
echo nl2br(htmlspecialchars($veri));
 #Çıktı: Selam ben <Lisans>
#' Selamlar nasılsınız? '
  ?>
Veritabanına bilgi eklerken ise ayrıyetten mysql_escape_string kontrolünden geçirmek gerekir. Çünkü veritabanında ' tag'ı sorun yaratır. Veritabanında string ifadeler '' tag'ları arasına yazılır ve kötü niyetli kişi ' OR '1'='1' komutu ile veritabanında yapılan kontrol'ü aşar ve panelinize sızabilir. Bunun önüne geçmek için mysql_escape_string yada addslashes komutu kullanılır.Ve benden size bir öneri veritabanında karşılaştıracağınız değer sayısal'da olsa mutlaka '' tagları arasın'a alın.
   <?php
$veri = "' OR '1'='1'  ";
$veri = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($veri) : mysql_escape_string($veri); //Normalde çalışması gerk bende çalışmadı neden bilmiyorum :~)
echo  $veri;
   ?>
yada addslashes yöntemini kullanırız
$veri = "' OR '1'='1'  ";
$veri = get_magic_quotes_gpc() ? addslashes($veri) : $veri;
echo  $veri;
Eğer veritabanına int,double, float gibi sayısal değer gönderirseniz ve bunu tırnaklar içine almak istemezseniz (olur ya bununda bug'u çıkar) o zaman intval, doubleval, floatval kullanılır.Bunlar kötü kodlardan arındırır örneğin:
<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
?>
floatval
 
<?php
$var = '122.34343The';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 122.34343
?>
Bir diğer olay'da index.php?inc=deneme şeklinde olan uzantılarda deneme,islem vs. gibi kelimelere göre sayfaları include etmektir. Bazı arkadaşlar bu konuda ya güvenlik açığı verir yada çok fazla if kontrol'ü ile performans kaybı. Bunun için switch öneririm. Switch kullanımı hem performans bakımından hızlıdır hemde hatalara yer vermez.Örnek kullanımı:
<?php
switch(strtolower($_GET['inc'])){
case "islem": include_once('islem.php'); break;
case "iletisim": include_once('iletisim.php'); break;
default: include_once('anasayfa.php');break;
}
?>
Böylece kişi ?inc=<script>alert(document.cookie);</script> komutu yollamaya kalksa bile case'lerle uyumlu olmadığı için anasayfa.php'yi include edecektir switch.
urldecode ve urlencode bu ikisi daha çok link olaylarında kullanılır. Örneğin sitenize verilen linklere direk değilde FONONLINE Low cost domain names, domain transfers, web hosting, email accounts, and so much more. şeklinde yapmak istiyorsunuz o zaman bunu kullanırsınız. Fakat bu kodunda bug'u vardır. Html kodları tanınmayacak hale sokar o yüzden sadece url'leri içine atarsınız.
<?php
$veri = "http://www.google.com";
echo "<a href=?ref=".urlencode($veri).">google</a>";
#Çıktı: http://siteadi.com/?ref=http%3A%2F%2Fwww.google.com
?>
urldecode ile'de http%3A%2F%2Fwww.google.com bu hale gelen link'i düzeltebilirsiniz.
<?php
$veri = "http%3A%2F%2Fwww.google.com";
echo urldecode($veri);
#Çıktı: _http://www.google.com
?>
Evet arkadaşlar güvenlik konusu önemli konudur.Php'cilerden kullandıkları yöntemleri,Amatörlerden soru'larını bu topic altına bekliyorum.Yanlış kod kullanımı istenmeyen sonuçlar doğurabilir unutmayalım
iyi akşamlar iyi çalışmalar
Lisans