• 11-09-2021, 14:55:58
    #10
    petri adlı üyeden alıntı: mesajı görüntüle
    @mojomi; @Stein; @irfancoban; mysqli yerine neden PDO tercih ettiğinizi, farklarını anlatabilecek birisi var mı?
    Daha güvenilir...
  • 11-09-2021, 14:58:16
    #11
    PDO ile birlikte prepare da kullanmanız gerekiyor. Prepare metodu kendinden tüm sql injectionlara karşı koruma sağlar.

    https://kodlamaklazim.com/blog/php-prepare-kullanimi

    Birde gelen veriyi aşağıdaki fonksiyondan geçirsen tam koruma sağlamış olursun.

    function Guvenlik($gelenveri="0", $integer = 0) {
        $gelenveri = htmlspecialchars(strip_tags($gelenveri),ENT_QUOTES);
    
        if($integer == 1){
            if(!ctype_digit($gelenveri)){
                $gelenveri = 0;
            }
    
            if(strlen($gelenveri)>10){
                $gelenveri = 0;
            }
        }
    
        return trim($gelenveri);
    }
  • 11-09-2021, 14:59:45
    #12
    $veri = strip_tags(trim(addslashes($_GET['sayfa'])));

    şeklinde kullan.
  • 11-09-2021, 15:00:22
    #13
    ibocum adlı üyeden alıntı: mesajı görüntüle
    Bunu denemiştim fakat yapıyı bozmuştu.
    if(isset($_GET['page'])) {
        if(is_numeric($_GET['page']) && is_int(intval($_GET['page']))) {
            $sayfa = intval($_GET['page']);
        }
    }
    Bu şekilde olması gerekiyor, nasıl yapıyı bozdu tam anlamadım?
  • 11-09-2021, 15:02:46
    #14
    profweb adlı üyeden alıntı: mesajı görüntüle
    if(isset($_GET['page'])) {
        if(is_numeric($_GET['page']) && is_int($_GET['page']) {
            $sayfa = intval($_GET['page']);
        }
    }
    Bu şekilde olması gerekiyor, nasıl yapıyı bozdu tam anlamadım?
    Bu sekilde tam guvenlik saglanmaz hocam. Ornek veriyorum decimal hex ile sql injection yaparlarsa sayisal degerler ile cekerler gene en mantiklisi once prepare etmek yukaridaki mesajda link birakilmis
  • 11-09-2021, 15:09:19
    #15
    phpxtr adlı üyeden alıntı: mesajı görüntüle
    Bu sekilde tam guvenlik saglanmaz hocam. Ornek veriyorum decimal hex ile sql injection yaparlarsa sayisal degerler ile cekerler gene en mantiklisi once prepare etmek yukaridaki mesajda link birakilmis
    O kadar ileri seviye bilgim yok. Zaten yaptığım sadece sayfalama. Veritabanından gelmiyor, sadece verileri ona göre listeliyor Şu kod ile halletim;
    strip_tags(trim(addslashes($_GET['sayfa'])));
  • 11-09-2021, 15:12:36
    #16
    prepare tek başına sql injectionlara karşı tam koruma sağlar => yanlış
    charset belirtmeniz gerekiyor ve emulate kapatmanız gerekiyor.
    sonuç olarak default ayarlarda hem pdo da heme mysqli de prepare tam koruma sağlamaz
  • 11-09-2021, 23:23:39
    #17
    prepare ile değişkenleri belirtip execute ile değişkenleri vermeniz en güzeli olucaktır. Kullandığınız şekil normal mysql query ile bir farkı pek yok maalesef. mysql_escape_string gibi fonksiyonlar da kaldırıldı bildiğim kadarıyla muadili bulmak yerine bahsettiğim şekilde yapıp devam etmeniz en güzeli olur. Harici olarak is_numeric gibi fonksiyonları kullanıp sorguyu erkenden kesmeniz performans açısından bir artı olucaktır , mysql sunucusu yok yere sorgulama işlemi yapmamış olur. Kolay gelsin
  • 12-09-2021, 00:20:42
    #18
    Bas intvali geç hocam, intval sql injection'ı keser. İlk başta is_numeric ile test edin false a düşerse kesin. Ardından da ne olur ne olmaz intval ile sorguya geçin değişkeni.

    PDO tek başına sql injection'ı kesmez, prepare kullanın sorgularda. Değişkeni de digit olarak tanımlayın sorguda.

    İntval basınca öğe sayısal değilse 0'a döner. İntval'li değeri de tekrar if 0 ise kontrolü çevirip sıfır ise kesin kodu.

    Ve dikkat edin, intval(string) değerini is_numeric'e sokmayın. Kirli kod 0 a döner ve is numeric de True dönebilir. Saf get değerini sokun önce is numeric'e.

    Sağlıcakla.