PHP, bildiğiniz gibi web için en popüler programlama dillerinden biridir. Her ne kadar birileri bunu kabullenmek istemese de. Kullanımı oldukça esnek olan bu dil programcıya çok fazla yardımcı olabilir aynı zamanda güvenlik açıkları konusunda barikatlar da yaratabilir.
Bu yazıda, bazı yaygın PHP güvenlik tuzaklarından ve geliştirme hatalarından kaçınmanıza yardımcı olacak 5 ipucu inceleyeceğiz. Peki güvenlik zafiyetlerinden kaçınmamız için neler yapmamız gerekiyor?
1- Uygun Hata Raporlarını Kullanmalısınız
Proje geliştirme işlemi sırasında, uygulama hatası raporlaması sizin en iyi arkadaşınızdır. Hata raporları, sizin yazım hataları bulmanıza yardımcı olur. Değişkenler, hatalı işlev kullanımı ve çok daha fazlasını bu fonksiyonlar bizim için otomatik olarak algılar. Ancak, projeyi yayına alıp bu hataları açık olarak bırakırsanız kötü niyetli kişilere davet çıkarmış olursunuz. Bu hatalar kullanıcılarınıza sisteminiz hakkında bilgi verebilir (Çalıştırdığınız yazılım, klasör yapısı, vs.)
Siteniz canlı yayına gönderildikten sonra, tüm hataları gizlediğinizden emin olmalısınız. Bu, aşağıdaki basit işlevi çağırarak yapılabilir.
2- Kötü Özellikleri Devre Dışı Bırakın
PHP geliştiricileri en eski zamanlarından beri, geliştirmeyi kolaylaştırmak için bazı özellikler kullanırlar. Bunlardan bazıları inanılmaz düzeyde yararlıdır özellikler içerir, bazılarıysa istenmeyen sonuçlara neden olabilir. Ben bunları “kötü” olarak adlandırıyorum. Geliştirme sürecine başlarken yapmanız gereken ilk şeyler, bu özelliklerden bazılarını devre dışı bırakmak olacaktır. Ana bilgisayarınıza bağlı olarak, sanal sunucunuzda bunlar kapalı olabilir veya kapatılmayabilir. Kendi bilgisayarınızda veya benzeri diğer yerel bilgisayarlarda uygulama geliştiriyorsanız bunlar muhtemelen kapatılamazlar. Bu özelliklerden bazıları PHP6’da da kaldırılmıştır, ancak PHP4’te bulunmaktadır. Yalnızca PHP5 uygulamalarında kullanımdan kaldırılmıştır. PHP sürümünüze göre kontrolleri sağlamanızda fayda var.
Register Globals
register_globals ile hızlı bir şekilde uygulanma geliştirmeye yardımcı olması amaçlanmıştır
Örnek ile açıklayalım. Örneğin bir URL’yi ele alalım, http: //fatihsoysal.com/index.php?var=1, bu bir sorgu dizesi içerir.
Register_globals deyimi, $var ile değere erişmemizi sağlar. Şimdi karşı koruma sağlamayan PHP uygulamalarına kolayca erişebiliriz. Bu bizim için istenmeyen bir durum. Bu fonksiyonu devre dışı bırakmak için sunucunuzdaki .htaccess ve php.ini dosyanıza erişim sağlayın. Buradaki değerleri aşağıdaki gibi güncelleyin.
Disabling with .htaccess
1 |
php_flag register_globals 0 |
Disabling with php.ini
1 |
register_globals = Off |
Magic Quotes (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
Magic Quotes, programcıların sorunlarını kurtarmak için tasarlanmış bir özellikti. Addslashes () ve benzeri diğer güvenlik özelliklerini kodlarında kullanmamak için. Bu fonksiyon birden fazla eğik çizgi eklenerek hatalara neden olabilir. Veritabanı motorunda, birçok veritabanına özgü karakterler vardır. Bunları kullanmaktan çekinmek gerekir. Bu fonksiyonu normal betikten devre dışı bırakamıyoruz. php.ini ve htaccess güncellemesi gerekmekte.
Disabling with .htaccess
1 |
php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0 |
Disabling with php.ini
1 2 3 |
magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off |
3- Girişi Doğrula
Yukarıdaki anlattıklarıma ek olarak, koruma için başka yol da girdi doğrulamaktır. Pek çok uygulamada, aslında zaten giriş işlemlerinde ne istenildiğini herkes az çok biliyor.
Örneğin, kullanıcıları listeleyen bir uygulama oluşturduğumuzu varsayıyorum. Doğum günlerini kullanıcıların kendi eklediklerini düşünelim. Nelere ihtiyacım var? 1-12 arası bir ay, bir sayı olarak 1-31 arasında bir gün ve bir yıl. (YYYY biçiminde Uygulamanızda dil bilgisi (regex), kontrolu yapmak güvenlik adına mükemmel bir yoldur.
1 2 3 4 5 6 7 8 9 10 11 12 |
if ( ! preg_match( "/^[0-9]{1,2}$/", $_GET['month'] ) ) { // handle error } if ( ! preg_match( "/^[0-9]{1,2}$/", $_GET['day'] ) ) { // handle error } if ( ! preg_match( "/^[0-9]{4}$/", $_GET['year'] ) ) { // handle error } |
4- Kullanıcı Girişinde Siteler Arası Komut Dosyası (XSS) Saldırıları İzleme
Bunun için BBCode kütüphanelerinden birini kullanabilirsiniz. Detaylı bilgi için HTML_BBCodeParser
1 2 |
$username = mysqli_real_escape_string( $GET['username'] ); mysql_query( "SELECT * FROM tbl_members WHERE username = '".$username."'"); |
1 2 3 4 |
$id = $_GET['id']; $statement = $connection->prepare( "SELECT * FROM tbl_members WHERE id = ?" ); $statement->bind_param( "i", $id ); $statement->execute(); |