PHP Güvenlik Açıkları – PHP Güvenliği için Yöntemler – PHP Güvenlik Açıklarını Kapatmak

0
2018
PHP Güvenlik Açıkları - PHP Güvenliği için Yöntemler - PHP Güvenlik Açıklarını Kapatmak
PHP Güvenlik Açıkları - PHP Güvenliği için Yöntemler - PHP Güvenlik Açıklarını Kapatmak

Web uygulamaları her türlü sahte saldırıdan korumak, bir web geliştiricisi için en önemli durumdur. Web uygulamaları hiçbir güvenlik sorunu veya güvenlik açığı bırakmayacak kadar güvenlikli bir şekilde geliştirilmeli. Herhangi bir kötü niyetli saldırı olasılığını ortadan kaldırmalısınız.

PHP Güvenliği İçin En İyi Yöntemler

Düzenli olarak PHP versiyonunuzu güncelleyin

En son yayınlanan PHP versiyonu 8.0’dır. PHP versiyonunuzu mutlaka en son sürümde tutmalısınız. PHP geliştiricileri her yeni versiyonda, bir önceki versiyondaki olan güvenlik açıklarını kapatmak ve yeni özellikler geliştirmek için kod yazarlar. En güncel PHP versiyonunu https://www.php.net/supported-versions.php adresinden kontrol edebilirsiniz. Bu adreste PHP versiyonlarının hangi tarihe kadar güvenlik desteği alabileceğini görebilirsiniz.

Cross-site Scripting (XSS) kaçının

Cross site scripting yani siteler arası komut dosyası çalıştırma, web sitenin koduna veya çıktısına harici bir komut dosyasının yerleştirildiği bir tür kötü amaçlı web saldırısıdır. Cross-Site Scripting (XSS), yazılımcının kullanıcıdan aldığı girdileri gerekli HTML ve JavaScript filtrelerinden geçirmediği takdirde oluşan bir zafiyettir. Girdiler gerekli filtrelerden geçmediği taktirde, eğer kullanıcı aynı zamanda bir saldırgan ise; diğer kullanıcılara veya doğrudan sisteme zarar verebilecek zararlı kodları çalıştırabilir. HTML, CSS ve JavaScript tarayıcı tarafından yorumlanan diller olduğundan dolayı, yazılan zararlı kod doğrudan diğer kullanıcıları da etkileyebiliyor. 3 tipi vardır:

  1. Reflected XSS
  2. DOM-Based XSS
  3. Stored XSS

SQL Injections Ataklarından Korunun

PHP programlama dilinde en yaygın atak türlerinden biri SQL injection’dur. Tek bir sorgu tüm uygulamayı tehlikeye atabilir. SQL injection saldırılarında saldırganlar sorgular üzerinden verilerinizi değiştirmeye çalışabilir veya verilenizin tümüne erişebilir. Uygulamanızda bir kullanıcı verisini çekmek için doğrudan SQL kodunda kullanıcında alınan girdiyi kullandığınızı varsayalım. SQL kodunuz aşağıdaki gibi olduğunu kabul edelim:

$sql = "SELECT * FROM users WHERE username = '" . $username . "';

İşte buradaki $username değişkeni tüm veritabanını silmek de dahil olmak üzere veritabanına zarar verebilecek sql komutları içerebilir. Peki sql injections atakları nasıl önlenir?

PHP’de SQL Injections Atakları Nasıl Önlenir?

PHP’de PDO yapısını kullanarak bu tarz ataklardan kurtulabilirsiniz. PDO güvenli SQL sorguları yazmanıza imkan verecektir. PDO ile input’a girilen özel karakter sorguyu değiştiremez.

Aşağıdaki kod bloğunda SQL koduna injection yapılabilir.

1.	$sql = "SELECT username, email FROM users WHERE id = ".$id." ;
2.	
3.	foreach ($dbh->query($sql) as $row) {
4.	
5.	printf ("%s (%s)\n", $row['username'], $row['email']);

Burada PHP PDO yapısını kullanırsak kodumuz şu şekilde olmalıdır:

1.	$sql = "SELECT username, email FROM users WHERE id = :id";
2.	
3.	$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
4.	
5.	$sth->execute([':id' => $id]);
6.	
7.	$users = $sth->fetchAll();

PHP’de Siteler Arası İstek Sahteciliği XSRF/CSRF

Türkçe açılımı “Siteler Arası İstek Sahtekârlığı” şeklinde olan CSRF zafiyeti; web uygulamasını kullanmakta olan kullanıcıların istekleri dışında işlemler yürütülmesidir. Uygulamaya giden isteklerin hangi kaynaktan ve nasıl gönderildiği kontrol edilmeyen sistemlerde ortaya çıkan bu zafiyet, aslında uygulamayı kodlayan yazılımcıların gözünden kaçan bir ayrıntıdır diyebiliriz. Genelde CSRF veya XSRF şeklinde kısaltılan bu güvenlik açığı “Session Riding” olarak da bilinmektedir. CSRF, istek verilerini okuyamaz ve çoğunlukla HTML etiketlerinde herhangi bir bağlantı veya değiştirilmiş veri göndererek durum değiştirme isteğini hedefler.

Bu durumu daha iyi anlayabilmek için örnek bir senaryo üzerinde inceleyelim:

Kurban, tarayıcısının bir sekmesinde banka hesabında oturum açmış halde işlemlerini yaparken, bir diğer sekmesinde ise e-posta hesabında gelen kutusunu incelemektedir.

Bu esnada kullanmış olduğu banka uygulamasında dışarıdan gelen veya dışarıya giden istekler engellenmemiştir.

Saldırgan bu durumu fark ettikten sonra, banka uygulamasında bulunan para gönderme formundaki html form elemanlarını, parayı kendine gönderecek şekilde, kendi oluşturmuş olduğu html sayfasına yazıp bu banka uygulamasına gönderim yapmasını sağlar.

Saldırgan, hazırlamış olduğu html sayfasını kullanıcıya e-posta yoluyla gönderdikten sonra, kullanıcı yan sekmesinde bulunan gelen kutusunu incelemeye koyulur.

Kullanıcı ilgili e-postada bulunan html sayfasına gittiği takdirde, saldırgan ilgili havale işleminde gönderilmiş olan parayı kendine yönlendirmiş olacaktır.

XSRF/CSRF saldırısını token kullanarak çözebilirsiniz. Sitenizde formlarda aşağıdaki gibi bir token yapısı kullanıp, bu token’ı kullanıcı için kontrol ederek ataklardan korunabilirsiniz.

  <input type=”hidden” name=”token” value=”R6B7hoBQd0wfG5Y6qOXHPNm4b9WKsTq6Vy6Jssxb”/>



PHP’de Oturum Ele Geçirme (Session Hijacking)

İki bilgisayar arasındaki geçerli TCP iletimini ele geçirme saldırısıdır. Çoğu doğrulama (authentication) TCP oturumu başlangıcında olduğundan bu, saldırganın makineye erişmesini sağlar. Saldırganlar kurulmuş TCP oturumlarındaki tüm trafiğini dinleyip kimlik, bilgi hırsızlığı, dolandırıcılığı vb. yaparlar.

Session hijacking, kurbanların cookie veya session bilgilerini bir şekilde elde ederek bu cookie veya session bilgisinin saldırganın tarayıcısına enjekte edilmesi sonucu, kurbanın hesabına giriş yapabilmesi olayıdır.

Session Hijacking önlemek için oturumları her zaman IP adresine bağlamalısınız.

1.	$IP = getenv ( "REMOTE_ADDR" );

Gelen kullanıcı istekleri farklı bir ip adresi üzerinden geliyorsa, hızlı bir şekilde tüm oturumları sonladırmalı, session bilgisini ve çerezleri silmelisiniz.

Çerezli silmenin en güvenli yolu aşağıdaki gibidir:

1.	setcookie ($name, "", 1);
2.	
3.	setcookie ($name, false);
4.	
5.	unset($_COOKIE[$name]);

1. satır çerezin süresinin dolmasını sağlar. 3. Satırda cookiye false ataması yapılır. 5. Satırda ise bu cookie tamamen ortadan kaldırılır, yok edilir.

PHP’de Güvenli Dosya Yükleme Kullanın

Dosya yükleme, herhangi bir kullanıcı veri işleme uygulamasının gerekli bir parçasıdır. Ancak bazı noktalarda, makalede daha önce açıkladığımız gibi dosyalar XSS saldırıları için de kullanıldığını unutmayın. Temel bilgilere dönersek, her zaman formdaki POST isteğini kullanın ve <form> etiketinde enctype = “multipart / form-data” özelliğini bildirin. Daha sonra dosya türünü finfo sınıfını kullanarak şu şekilde doğrulayın:

1.	$finfo = new finfo(FILEINFO_MIME_TYPE);
2.	$fileContents = file_get_contents($_FILES['some_name']['tmp_name']);

Uygulamaların güvenliğini güçlendirmek için dosya boyutu, dosya yeniden adlandırma ve yüklenen dosyaları özel konumda saklama gibi birkaç başka doğrulama da gereklidir.

HTTPS İçin SSL Sertifikası Kullanın

Google Chrome, Opera, Firefox ve diğerleri gibi tüm modern tarayıcılar, web uygulamaları için HTTPS protokolünü kullanmanızı önerir. HTTPs, güvenilmeyen siteler için güvenli ve şifreli bir erişim kanalı sağlar. Web sitenize SSL sertifikası yükleyerek HTTPS’yi eklemelisiniz. Ayrıca web uygulamalarınızı XSS saldırılarına karşı güçlendirir ve bilgisayar korsanlarının kod kullanarak taşınan verileri okumasını engeller.

PHP Uygulamaları Bulutta Çalıştırın

Her türlü web sitesi ve uygulama için hızlı, güvenli ve güvenlidirler. Web uygulamaları için oldukça zararlı olan DDOS, Brute force ve phishing saldırılarını önlemek için her zaman güvenli bir katman sağlarlar. DigitalOcean, Linode, AWS gibi bulut yapılarını kullanabilirsiniz.

Kullanıcı Girdileri Her Zaman Doğrulayın

Kullanıcının girdiği verileri istediğiniz formata uygun olup olmadığını kontrol etmelisiniz. Genellikle geliştiriciler, doğum tarihi veya telefon numarası gibi veri biçimlerini doğrulamak için düzenli ifadeler (regex) kullanır. Burada en önemli şey, sizin istediğiniz formata olan uygunluğunu kontrol etmektir.

Dizin Erişimini Sınırlandırın

Open_basedir işlevi, PHP’nin dosya sisteminizde erişebileceği dosyaları sınırlamanıza izin verir. Open_basedir işlevini projenizin köküne ayarlarsanız, bu, yalnızca projenizin kök dizinindeki ve aşağıya doğru dosyalara erişebileceği anlamına gelir.

Kötü niyetli bir kullanıcının PHP aracılığıyla sunucunuza erişmesi ve / etc / passwd gibi hassas dosyalara erişmeye çalışması durumunda, open_basedir işlevi bunu önleyecektir.

URL Kodlama Kullanın

PHP, geliştiricilere güvenli bir şekilde geçerli URL’ler oluşturmaları için urlencode işlevi verir. PHP belgelerine göre, işlev bir URL’nin sorgu bölümünde kullanılacak bir dizeyi kodlarken kullanışlıdır.

Kullanıcı girdisinin bir URL oluşturmak için kullanıldığını hayal edin. Bu durumda, güvenli bir URL oluşturmak için urlencode işlevini kullanabilirsiniz.

<?php echo '<a href="mylink?user=', urlencode($userID), '">';?>

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz