folder Tahribat.com Forumları
linefolder Asp - Php - Cgi - Perl
linefolder PHP SQL Injection Fonksiyonu



PHP SQL Injection Fonksiyonu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Daft Ground
    PLaXToR
    PLaXToR's avatar
    Kayıt Tarihi: 08/Temmuz/2003
    Erkek

    Selamlar,

    2 ayrı fonksiyon yazdım birini get ettiğim id lerde birini get ettiğim stringlerde kullanıyorum. Sizce sql injection için yeterli mi yada yanlışlık ve eksiklik var mı öneride bulunabilir misiniz?

    Bunu stringler için kullanıyorum

    function fullstringfilter ( &$yazi ) {
    		$danger_words = array("*","=","<",">",";","(",")","+","#","'","&","%","?","´","`","UNION","SELECT","WHERE","LIKE","FROM","UPDATE","INSERT","ORDER","GROUP","ALTER","ADD","MODIFY","RENAME",chr(39));
    		$replace_words = "";
    		$yazi = str_replace($danger_words, $replace_words, $yazi);
    		$yazi = preg_replace( "'<script[^>]*>.*?</script>'si", '', $yazi );
    		$yazi = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 (\1)', $yazi );
    		$yazi = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$yazi);
    		$yazi = preg_replace( '/<!--.+?-->/', '', $yazi );
    		$yazi = preg_replace( '/{.+?}/', '', $yazi );
    		$yazi = preg_replace( '/ /', '', $yazi );
    		$yazi = preg_replace( '/&/', '', $yazi );
    		$yazi = preg_replace( '/"/', '', $yazi );
    		$yazi = strip_tags( $yazi);
    		$yazi = stripslashes( $yazi );
    		$yazi = htmlspecialchars( $yazi );
    		$yazi = mysql_real_escape_string( $yazi );
    		return $yazi;
    }

     

    Bunu ID ler için kullanıyorum:

     

    function fullidfilter ( &$yazi ) {
    		$danger_words = array("*","=","<",">",";","(",")","+","#","'","&","%","?","´","`","UNION","SELECT","WHERE","LIKE","FROM","UPDATE","INSERT","ORDER","GROUP","ALTER","ADD","MODIFY","RENAME",chr(39));
    		$replace_words = "";
    		$yazi = str_replace($danger_words, $replace_words, $yazi);
    		$yazi = preg_replace( "'<script[^>]*>.*?</script>'si", '', $yazi );
    		$yazi = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 (\1)', $yazi );
    		$yazi = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$yazi);
    		$yazi = preg_replace( '/<!--.+?-->/', '', $yazi );
    		$yazi = preg_replace( '/{.+?}/', '', $yazi );
    		$yazi = preg_replace( '/ /', '', $yazi );
    		$yazi = preg_replace( '/&/', '', $yazi );
    		$yazi = preg_replace( '/"/', '', $yazi );
    		$yazi = strip_tags( $yazi);
    		$yazi = stripslashes( $yazi );
    		$yazi = htmlspecialchars( $yazi );
    		$yazi = mysql_real_escape_string( $yazi );
    		$yazi = intval( $yazi);
    		return $yazi;
    }

     

     


    If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    moi
    moi's avatar
    Kayıt Tarihi: 26/Mayıs/2009
    Erkek

    http://php.net/manual/tr/mysqli.quickstart.prepared-statements.php

    gozatmani tavsiye ederim.


    Sadece paranoyaklar hayatta kalır...
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PcK0
    PcK0's avatar
    Kayıt Tarihi: 13/Nisan/2007
    Erkek

    PDO prepare ile:

    $birHazirSorgu = $birPDOObjesi->prepare("SELECT * FROM tablo WHERE id = ?");

    $birHazirSorgu->execute( [$degisken] );

    Şeklinde güvenliği hazır olarak oluşturulmuş oldukça hızlı bir eklenti yerine niye kendin yazmaya çalışıyorsun?

    Ayrıca PHPnin klasik MySQL bağlantıları artık daha fazla geliştirilmeyecek. Yeni olarak MySQLi ve PDO devam edecek.


    Sadece bi imza..
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Daft Ground
    PLaXToR
    PLaXToR's avatar
    Kayıt Tarihi: 08/Temmuz/2003
    Erkek

    Yani bunun yerine;

     

    $id = $_GET['id'];
    $query = mysql_query("SELECT * FROM uyeler WHERE uye_id = '{$id}'");
    if ( mysql_affected_rows() ){
        $row = mysql_fetch_assoc($query);
        print_r($row);
    }

     

    PDO ile Bunu kullan diyorsunuz

    $id = $_GET['id']; 
    $query = $pdo->query("SELECT * FROM uyeler WHERE uye_id = '{$id}'")->fetch(PDO::FETCH_ASSOC);
    if ( $query ){
        print_r($query);
    }

     

    Ya da MYSQLi olarak şöyle yap diyorsunuz

    $id = $_GET['id'];
    $query = mysqli_query("SELECT * FROM uyeler WHERE uye_id = '{$id}'");
    if ( mysqli_affected_rows() ){
        $row = mysqli_fetch_assoc($query);
        print_r($row);
    }

     

    Bu şekilde id olarak içeri aldığımız değişkene sql injection yapamazlar yani? Çünkü stackoverflow da yapılabileceği ile ilgili bir tartışma söz konusu buyrunuz:

    http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection

    Sizce?

     

    Ayrıca İşin komik tarafı ben fonksiyon sormuşum... bu fonksiyon nasıl güzelleştirilebilir var mı öneriniz diye. PDO kullan deyip basit cevaplar verilip geçiştirilmişim. Fonksiyon namına cevap yok. Belki 2000 yılında yaptığım bir sistemde kullanacağım hiç düşünen olmamış. Ah gençlik ah. :)

    PLaXToR tarafından 02/Ağu/16 09:55 tarihinde düzenlenmiştir

    If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    PHP-SEO Developer
    Erdem
    Erdem's avatar
    Kayıt Tarihi: 04/Haziran/2002
    Erkek

    prepare methodlarında açıkların olabileceğini okumuştum. Sende bir link vermişsin ancak sürekli yenilenen bir alt yapı var sonuçta.

    Her ne olursa olsun id leri muhakkak integer olup olmadığını kontrol etmeni öneririm. 

    Ayrıca mysql_real_escape_String bir çok sunucuda hata veriyor tarihi geçti. 

    Birde süzgece alırken tüm karakterleri ufak yap ve danger_words değişkenlerinide ufak yap.  iNsErt Yazan kişi sızmasın. 

    Ayrıca her sayfada bir referer kontrolü yaparak, yada random bir değişken basarak bir sonraki sayfanın çalışmasını sağlarsan güvenliğin biraz daha artmış olacaktır.

     


    Php for SEO nun ardından Php for Gcode (CNC)
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Daft Ground
    PLaXToR
    PLaXToR's avatar
    Kayıt Tarihi: 08/Temmuz/2003
    Erkek

    Sonunda fonksiyon için önerisi olan birisi... Çok teşekkür ederim @Erdem kardeşim :)


    If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek

    prepare metodu 100% güvenlik sağlamıyor olması lazım.

    mysql öldü zaten, o yüzden burdaki bazı metotlardan hatalar alabilirsin hocam.


    Hello, i am nothing. I come from Neverland.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozdemyr
    ozdemyr's avatar
    Kayıt Tarihi: 21/Haziran/2015
    Erkek

    PDO varken kendi fonksiyonlarını yazman gereksiz söylendiği gibi. Zaten fonksiyonlar bu haliyle güvensiz. str_replace fonksiyonu büyük-küçük harf duyarlılığına sahip, dolayısıyla saldırgan "INSERT" yerine "inserT" yazdığında fonksiyon gerekli filtrelemeyi yapmayacak ve sql sorgusu çalışacaktır. Örneğini şurada "output" kısmında görebilirsin: https://eval.in/616580

    Bunu aşmak için tüm büyük-küçük harf olasılıklarını dahil eden bir yöntem geliştirmen lazım, bu şekilde sağlıksız. Ayrıca o regex'ler de sanırım XSS'leri engellemek için yazılmış fakat bunu da HTML'yi output ederken konteksine uygun şekilde filtrelemen lazım. 

    mysql_real_escape_string fonksiyonu da tedavülden kalktı: http://php.net/manual/tr/function.mysql-real-escape-string.php

    Arkadaşların bahsettiği PDO prepare metodunun kullanımına verdiğin örnek yanlış.

    $id = $_GET['id'];
    $query = $pdo->query("SELECT * FROM uyeler WHERE uye_id = '{$id}'")->fetch(PDO::FETCH_ASSOC);
    if ( $query ){
        print_r($query);
    }

    Burada sorgu sql injection'a açık. Değişkenin geleceği yeri PDO'ya bildirdiğinde gerekli korumayı sağlar. Şu şekilde kullanılması gerekiyor:

    $pdo = ..;

    $sql = "SELECT * FROM uyeler WHERE uye_id = :id";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->execute();

    $results = $stmt->fetchAll();
    ozdemyr tarafından 03/Ağu/16 11:55 tarihinde düzenlenmiştir
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    lepusmorris
    lepusmorris's avatar
    Kayıt Tarihi: 31/Mart/2007
    Erkek

    ID'ler için bunu da kullanabilirsin hocam

    function sayi($int) {
    	$int = filter_var($int, FILTER_SANITIZE_NUMBER_INT);
    	$int = str_replace("+","",$int);
    	$int = str_replace("-","",$int);
    	return $int;
    }

     

     

    lepusmorris tarafından 04/Ağu/16 19:45 tarihinde düzenlenmiştir

    ..
Toplam Hit: 1013 Toplam Mesaj: 9
php sql injection function