PHP'de Güvenlik Sorunu

  • 5.737

Bu makaleyi okuyan PHP kod yazarları; içerik yönetimini farklı dosyaları çağırarak yapmanın yol açabileceği güvenlik sorunlarını ve bu tür bir sistemde güvenliğin nasıl sağlanabileceğini öğrenecekler.

Bu makaleyi okuyan PHP kod yazarları;
- İçerik yönetimini farklı dosyaları çağırarak yapmanın yol açabileceği güvenlik sorunlarını,
- Bu tür bir sistemde güvenliğin nasıl sağlanabileceğini öğrenecekler.

Dosya 'Include' Saldırıları

İnternette dolaşırken mutlaka görmüşsünüzdür, foo.php?hede=Homepage temasındaki içerik yönetim sistemlerini... hede bilgisine olmayan bir dosya ismi yazdığınızda da PHP'nin verdiği hata çıktısını da birkaç kişi fark etmiştir pekala Peki hiç bu şekilde basit olarak çalışan bir sitenin ne gibi ciddi sorunlara yol açabileceğini ya da güvenlik ile alakalı siteleri dolaşırken, eski PHP yazılımlarının büyük çoğunluğunda çıkan bu güvenlik açığının nedenlerini düşündünüz mü? O zaman sizi bu yazının devamına alalım...

Nasıl Çalışırlar?

Şöyle bir düşünün; PHP olarak hazırladığınız bir siteniz var ve bu site ana dosya olan index.php üzerinden çalışıyor. URL adresinden ?page=sayfa şeklinde aldığınız bilgi yoluyla dosya içeriğini sayfaya 'include' ediyorsunuz. Kaba taslak bir kodla yazacak olursak;



<?php 

if(!$_GET['page'])

include(
'anasayfa.php');

else

include(
$_GET['page'].'.php');



//

// ... ve diğer kodlar ...

//



?> ?>




Evet, herşey daha net oldu sanırım şimdi. Kullanıcıdan aldığımız sayfa adına .php uzantısını ekliyor ve sayfaya doğrudan 'include' ediyoruz.

Öyleyse, bu yazıda anlatılmaya çalışılan ciddi sorun nedir? Eğer kendinize böyle bir sistem hazırlamışsanız, sayfanıza foo.php?page=olmayanbirsayfa diye girdiğinizde [1] PHP'nin şuna benzer bir uyarı -ya da require() için mantık hatası (fatal error)- verdiğini göreceksiniz;


Warning: main(olmayanbirsayfa.php) [function.main]: failed to open stream: No such file or directory in /home/myxomatose/public_html/test.php on line 1




Warning: main() [function.include]: Failed opening 'olmayanbirsayfa.php ' for inclusion (include_path='/usr/share/php') in /home/myxomatose/public_html/test.php on line 1



"E biz de zaten bu tür bir URL adresine bağlantı koymuyoruz sitemizde, n'olacak ki?" derseniz, page bilgisine konulan bir uzak URL adresi [2], bu cümlenizin kursağınızda kalmasına sebep olabilr Bu tür bir yöntemle site tamamen ele geçirilerek zararlı kodlar çalıştırılabilir...

Nasıl Korunurum?

Kod yazma aşamasına geçmeden önce bilmemiz gereken bazı şeyler var;
- include(), include_once(), require() ve require_once() fonksiyonları dosya ekleme işlevindedirler. Sonu _once ile bitenler, dosyayı daha önce eklemişlerse bir daha eklememe gibi bir farka sahiptirler. Eğer bunlardan herhangi birini kullanacaksanız; require()'ın koddan çıkacak bir 'Fatal Error', include()'un ise koddan çıkmayacak bir uyarı (warning) vereceğini unutmamanız gerekmektedir. Bir hata durumunda yapılacakları/ekrana yazılacakları belirlemek içinse or die() ve or exit() gibi deyimleri de kullanabilirsiniz.

- Dosya çağırma fonksiyonları, dosyanın tam yolu belirtildiğinde de çalışma özelliğine sahiptirler. include('/home/myxomatose/public_html/include.php') gibi bir komut sağlıklı olarak çalışacaktır. Bu, yazacağımız kodda çok işimize yarayacak...

- Çağrılacak dosyaların isimlerini bir listede tutmanız her zaman en iyisi olacaktır

Kodlar...

Birkaç satır önce bahsettiğimiz gibi, kötü niyetli birileri sayfa olarak uzak bir URL adresi yazarsa, bu herşeyin sonu olabilir Peki eğer bir çağrılacak dosyayı, kendi dosya sistemimiz içinden olmasını zorulu kılarsak n'olur?



<?php 

error_reporting
(0);

define('PATH''/home/myxomatose/public_html');

include_once(
PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');

?> ?>




Bu kodda belirtilen URL adresi dahi olsa, dosya sisteminde bulunamayacağı için "Sayfa bulunamadı!" hatası gösterilecektir. Peki, sistemimiz çağrılan dosya içeriğini görüntülemek gibi bir işlem yapıyorsa diyelim, o zaman dosya sistemimiz içindeki dosyaları nasıl koruyacağız? Tabii ki bir dizi kontrolü yaparak [3]


<?php 

error_reporing
(0);

define('PATH''/home/myxomatose/public_html');

$pages = array('anasayfa''uyeler''kayit');



if(
in_array($_GET['page'], $pages))

include_once(
PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');

else

exit(
'Olmayan bir sayfa!');

?> ?>





İşte şimdi çok daha güvenli bir dosya çağırma sistemi oluşturduk Yazacağıız sistemlerde dosya 'include' açıklarının asgari seviyede olması için bu kod iskeletini düşünerek kod yazabilirsiniz. Ve son rötuşlar;



<?php 

error_reporing
(0);

define('PATH'dirname(<u>__FILE__</u>));

$pages = array('anasayfa''uyeler''kayit');



if(
in_array($_GET['page'], $pages))

include_once(
PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');

else

exit(
'Olmayan bir sayfa!');



//

// dirname(<u>__FILE__</u>) komutu, çalışan dosyanın bulunduğu tam dizin yolunu

// döndürür. <u>__FILE__</u> dosya yoluyla birlikte dosya adını alırken, dirname()

// ise dosya adını atar.

//

// Not: FILE komutunun başında HTML etiketleri var, kaldıramadım, onları

// görmezden gelin :]

//



?> ?>



DİPNOTLAR:

[1] Ve tabii dosya sisteminizde olmayanbirsayfa.php isminde bir dosyanız bulunmuyorsa,

[2] PHP ayarlarınızda "allow_url_fopen" seçeneği kapalıysa çalışmayacaktır pekala ancak hâlâ tehlikeli bir durumda olacaktır.

[3] in_array() fonksiyonu, kendisine verilen ilk parametrenin, ikinci parametrede verilen dizi (array) içinde olup olmadığını kontrol eder.
  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git