• 05-09-2012, 15:01:02
    #1
    Mesela en cok duydugum sql injection var, bunun onune nasil gecebiliriz? Tum kodlari duzeltmek zor olucagindan internette bazi fonksiyonlar buldum. Mesela bunlardan birisi:

    <?
    $url_denied = array( 
       '/bin', '/../', '../../', '/usr', '/etc', '/boot', '/dev', '/perl', '/initrd', '/lost+found', '/mnt', '/proc', '/root', '/sbin', '/cgi-bin', '/tmp', '/var', 
       'ps%20', 'wget%20', 'uname%20-a', '/chgrp', 'chgrp%20', '/chown', 'chown%20', '/chmod', 'chmod%20', 'md%20', 'mdir', 'rm%20', 'rmdir%20', 'mv%20', 'tftp%20', 'ftp%20', 'telnet%20', 'ls%20', 
       'gcc%20-o', 'cc%20', 'cpp%20', 'g++%20', 'python%20', 'tclsh8%20', 'nasm%20', 'perl%20', 'traceroute%20', 'nc%20', 'nmap%20', '%20-display%20', 'lsof%20', 
       '.conf', '.htgroup', '.htpasswd', '.htaccess', '.history', '.bash_history', 
       '/rksh', '/bash', '/zsh', '/csh', '/tcsh', '/rsh', '/ksh', '/icat', 'document.domain(', 
       '/....', '..../', 'cat%20', '/*%0a.pl', 
       '/server-status', 'chunked', '/mod_gzip_status', 
       'cmdd=', 'http://', 'exec', 'passthru', 'cmd', 'fopen', 'exit', 'fwrite', 
       '<script', '/script>', '<?', '?>', 'javascript://', 'img src=', 
       'phpbb_root_path=', 'sql=', 'delete%20', '%20delete', 'drop%20', '%20drop', 'insert into', 'select%20', '%20select', 'union%20', '%20union', 'union(', 
       'chr%20', 'chr(', 'http_', 'http', 'txt?', 'gif?', 'jpg?', 'dat?', '_http', 'php_', '_php', '_global', 'global_', 'global[', '_globals', 'globals_', 'globals[', '_server', 'server_', 'server[', 
       '$_request', '$_get', '$request', '$get', '\'', '/*', '+union', '/**/select', '+',
    ); 
    $_server = isset($_SERVER) && !empty($_SERVER) ? '_SERVER' : 'HTTP_SERVER_VARS'; 
    $_env = isset($_ENV) && !empty($_ENV) ? '_ENV' : 'HTTP_ENV_VARS'; 
    if ( ($url_request = !empty(${$_server}['QUERY_STRING']) ? ${$_server}['QUERY_STRING'] : (!empty(${$_env}['QUERY_STRING']) ? ${$_env}['QUERY_STRING'] : getenv('QUERY_STRING'))) ) 
    { 
       $url_request = preg_replace('/([\s]+)/', '%20', strtolower($url_request)); 
       $url_checked = preg_replace('/[\n\r]/', '', str_replace($url_denied, '', $url_request)); 
       if ( $url_request != $url_checked ) 
       {       $remote_addr = ( !empty($HTTP_SERVER_VARS['REMOTE_ADDR']) ) ? $HTTP_SERVER_VARS['REMOTE_ADDR'] : ( ( !empty($HTTP_ENV_VARS['REMOTE_ADDR']) ) ? $HTTP_ENV_VARS['REMOTE_ADDR'] : getenv('REMOTE_ADDR') ); 
            $message = "<b>Tarih:</b> " . Date('D d M Y G:i', time()) . "\r\n<br />"; 
            $message .= "<b>Sorgulanan Baglanti:</b> " . $HTTP_SERVER_VARS['PHP_SELF'] . '?' . $url_request . "\r\n<br />"; 
            $message .= "<b>IP:</b> " . $remote_addr . "\r\n<br />"; 
               $message .= "<b>___________________________________________</b>\r\n<br />"; 
         $handle =fopen('loglar.php', 'a'); 
         fwrite($handle,$message); 
         fclose($handle); 
          die('<script>location.href="uyari.php";</script>'); 
       } 
    } 
    unset($_server); 
    unset($_env); 
    ?>
    Fakat bunda baya eksik oldugu soyleniyor.

    Ayrica sirf sql injection icin sormuyorum, php scriptteki cesitli guvenlik aciklarini nasil kapayabiliriz?
  • 05-09-2012, 15:59:39
    #2
    injection'dan kaçınmak istiyorsan, gettten veya karşıdan gelen veriyi neye gore süzdüreceğini bilmen lazım, atıyorum sadece sayı olan degerli alacaksan bunun farklı yontemleri mevcut.

    intval() ile alabilirsin ereg_replace ile sadece sayı aralıklarını çektirebilirsin, yeni ereg ile sadece harfleri alabilirsin..

    strip_tags ile html kodları sildirebilirsin veya addslashes ile / koyduyta bilirsin tehlikeli yerlere yontem cok ama ilk once sen gelen veriden ne almak istediğini bilmen lazım
  • 05-09-2012, 16:35:12
    #3
    kereky adlı üyeden alıntı: mesajı görüntüle
    injection'dan kaçınmak istiyorsan, gettten veya karşıdan gelen veriyi neye gore süzdüreceğini bilmen lazım, atıyorum sadece sayı olan degerli alacaksan bunun farklı yontemleri mevcut.

    intval() ile alabilirsin ereg_replace ile sadece sayı aralıklarını çektirebilirsin, yeni ereg ile sadece harfleri alabilirsin..

    strip_tags ile html kodları sildirebilirsin veya addslashes ile / koyduyta bilirsin tehlikeli yerlere yontem cok ama ilk once sen gelen veriden ne almak istediğini bilmen lazım
    https://www.r10.net/php/255784-sql-xs...n-korunma.html

    mesela bunu buldum. cunku cok kodlama yaptim ve bastan bunlara dikkat etmedim, bu ise yararmi yoksa tum kodlari teker teker duzeltmeli miyim?

    ayrica baska guvenlik aciklarida var diye biliyorum, onlarin onune nasil gecilir?
  • 05-09-2012, 20:28:09
    #4
    Hala yardım arıyorum
  • 05-09-2012, 21:18:53
    #5
    Sen ilk başta kereky'nin söylediği gibi nerelerde işlem yapacaksın onu tam belirt.

    Sadece sayı gelecek bir değişkene yukarıdaki fonksiyonu uygulaman bir anlam ifade etmez. Sadece sayı mı değil mi diye kontrol edersin.

    yazdığın yazılımda php'nin exec komutu çalışmayacak ise php.ini'den disabled_function değişkenine
    disable_functions = exec,shell_exec
    gibi ifadeler yazabilirsin.
    Sadece bunları yaptın tamam script güvenli olmaz. Upload ile gelen dosyaların uzantılarını kontrol et. Paylaşımlı Server Kullanıyor isen, başkasının hatası seni vurabilir.

    Buda sana yardımcı olacaktır -> http://php.net/manual/en/function.my...ape-string.php

    Yani açıkları tamamiyle kapatmak söz konusu değil, örnek vereyim. Staj yaptığım firma yazılımı yazıyor kullanıcıya teslim ediyor. Aradan 3 -4 ay geçmeden yazılım patlıyor. Sorun admin yetkisine sahip kullanıcının şifresini 1234abcd gibi aptalca bir şifre koyması.

    Sağlıcakla...
  • 06-09-2012, 02:37:52
    #6
    Üyeliği durduruldu
    Ben get ile gelen veriyle kategorimin/dosyamın idsini md5leyip kontrol ediyorum ona göre çekiyorum. veya
    if(!isnumeric($_GET[id])) {exit("ip adresiniz ve tarih/saat bilginiz alındı. yaşayın gönlünüzce")}
    olabilir