kablosuzkedi Sorular

PDO Kullanırken Nerede query(), nerede prepare() kullanmalıyım

By 19 Eylül 2017 7 Comments

Merhabalar,

PDO Kullanırken karşımıza çıkan bir ikilemden bahsediyoruz bu yazımızda. Nerede query(), nerede prepare() kullanmalıyız? İşte kablosuzkedi kanalımdaki PDO Parametre Ekleme İşlemleri adlı videoya gelen bir soruya istinaden bu yazıyı yazıyorum.  Soru aşağıdaki gibiydi;

pdo-query-prepare-kullanımı

Bu sorunun cevabı ise;

Merhaba dostum,

Hemen açıklayayım.. Şimdi şöyle düşünelim; biz dışarıdan Kategori ID si alıp bu kategoriye göre veritabanındaki kayıtları listeleme işlemi yapacağız diyelim. Bu kategori id bilgisini de GET metoduyla alalım.$_GET[“kategori_id”] gibi. Şimdi burada GET ile bu veriyi alırken adres çubuğumuzdaki URL yapımız şöyle olsun. urunler.php?kategori_id=1 gibi olsun mesela.. burada kategori_id=1, id=10, id=20 gibi degerler girerek verileri databaseden çekiyoruz diyelim.. Şimdii asıl açıklama burada;

id bilgisini alıyoruz;

$kategori_id = $_GET["kategori_id"];

eger;

$db->query("SELECT * from urunler WHERE kategori_id = $kategori_id")->fetchAll(PDO::FETCH_ASSOC);

şeklinde bir komut yazarsak bu komut çalışacaktır. Hem de sıkıntısız. Fakat, bizim url yapımızı çözmüş olan ve bir şekilde tablo yapımızı öğrenmiş olan kötü niyetli bir kullanıcı burada yani url’den bize id bilgisi yerine bir SQL kodu gönderir ve tüm tablo yapımızı silebilir. İşte bu duruma SQL Injection deniliyor. Yani normal URL yapımız şu şekildeyken;

urunler.php?kategori_id=3

kötü niyetli kullanıcı tablo adini ogrendiginde sunu yapabilir;

urunler.php?kategori_id=3;DELETE FROM urunler;

böylece ilk olarak urunler tablosundan kategori_id si 3 olan kayitlar getirilir. Ardından araya “;” koydugu için DELETE FROM urunler SQL komutunu calistirir. Böylece tablomuzdaki tüm veriler silinir.

İşte tüm bunların sebebi query kullandigimiz için olur. Eğer kullanıcıdan bir bilgi alıyorsak query() yerine prepare() komutunu kullanarak bu kullanıcıdan gelebilecek olası SQL komutlarını yani SQL Injection olayını ortadan kaldırmış oluyoruz.

Unutmamak gereken tek önemli şart; Kullanıcıdan bilgi gelmeden SQL komutu çalıştıracaksak query(), kullanıcıdan gelen bilgiyle beraber bir SQL komutu çalıştıracaksak o zaman prepare() kullanılmalı.

Saygilar

Gokhan

admin

admin

Müzik ve Yazılım ruhuna işlemiş eğlenceli biriyimdir :) Yaklaşık 14 yıldan beri yazılımın içinde bulunmaktayım. Bu yazılım denen dünyanın en eğlenceli mesleğinden teknolojileriyle ilgili bildiklerimi ülkemin güzel insanlarına bir nebze olsun aktarabilmek için çabalayan biriyim :) Nargile sever, kedilere ve adrenaline bayılırım.

7 Comments

  • Cihan Özen dedi ki:

    Hocam gerekli bilgi için teşekkür ederim, kullandığım şeyin bu denli güvenilir olduğunu yeni öğrendim. 🙂

  • Cihan dedi ki:

    Hocam iyi günler. Nedenini bir türlü çözemediğim birkaç hata alıyorum.Sizin kanalınızda kodladığınız gibi kodluyorum ancak rowCount() kullanımında boolean değer hatası alıyorum. Acaba sorun ne olabilir. Hata;

    Fatal error: Call to a member function rowCount() on boolean in /Library/WebServer/Documents/dersPHP/index.php on line 28

    Kod;

    try {
    $db = new PDO(“mysql:host=localhost; dbname=personel;charset=utf8″,”root”,”******”);
    echo “bağlandı”;
    } catch (PDOException $e) {
    echo $e ->getMessage();
    }

    $satir = $db->query(“SELECT * FROM personel”,PDO::FETCH_ASSOC);

    if($satir->rowCount()>0){
    foreach ($satir as $row){

    print_r($row);
    echo “”;

    /*echo “Personel Adı :”.$row[“ad”].””;
    echo “E-mail Adresi :”.$row[“email”].””;
    echo “”;*/

    }
    }

  • Cihan dedi ki:

    PHP 7.1

  • Cihan dedi ki:

    Sanırım problemimi çözebildim. Bu kadar kısa sürede ilgilendiğiniz için teşekkür ederim.

Leave a Reply