Jump to content

PHP'de Güvenlik Sorunu


Recommended Posts

Yazar: Ferit

Bu makaleyi okuyanlar;

- İç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 ...
//

?>[/CODE]

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...

[b]Nasıl Korunurum?[/b]

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

[b]Kodlar...[/b]

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?

[CODE]<?php
error_reporting(0);
define('PATH', '/home/myxomatose/public_html');
include_once(PATH.'/'.$_GET['page'].'.php') or exit('Sayfa bulunamadı!');
?>[/CODE]

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]

[CODE]<?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!');
?>[/CODE]

İş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;

[CODE]<?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 :]
//

?>
[/CODE]

[b]DİPNOTLAR:[/b]

[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.

Link to comment
Share on other sites

  • Administrator

anlamadım ? hatamız nedir ?


Bu başlığın ilk açıldığı yer Yazılım. Taşındığı yer: Web Sorunları & Çözüm Yolları Taşınma zamanı: 1 Dakika Önce
Konuları nereye açacağınızı bilmiyorsanız burayı okuyunuz.
[/CODE]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...