ctype_digit () sayı kontrolü php güvenlik

nssasmaz Nursin Şaşmaz Avatar

Get metodu ile numerik yani tamamen sayılardan oluşan bir ´id´ alıyorsunuz ve o ´id´ye ait bir veriyi veritabanından aşağıdaki kod ile çekiyorsunuz.

mysql_query("SELECT * FROM cars WHERE id = ´$_GET[aracno]´ LIMIT 1 ");

...ÇOK BÜYÜK BİR HATA...

...PHP-MYSQL GÜVENLİK İHLALİ...

...SQL Injection kurbanı olabilirsiniz...

Bunun için yapılması gereken $_GET[aracno] değerini süzerek tamamen gelmesi gereken şekilde bir veri olup olmadığını anladıktan sonra sql sorgusunu gerçekleştirmesini sağlmalıyız.

Önerilen seçeneklerden biri olan ctype_digit () ile gelen bir verinin içindekilerin tamamen sayısal olup olmadığını kontrol edebilirsiniz.

$deger="nursin23";
if (ctype_digit ($deger)) {
    echo "Değer tamamen rakamlardan oluşursa bu uyarı çıksın.";
} else {
    echo "Değerin içinde numaraların dışında harfler ve özel karakterlerde var.";
}

Çıktısı şu şekilde olacaktır :

Değerin içinde numaraların dışında harfler ve özel karakterlerde var.

Fakat $deger="15" yada $deger=15; olduğu takdirde çıktı şu şekilde olacaktır:

Değer tamamen rakamlardan oluşursa bu uyarı çıksın.


Eğer üsttede söylediğim şekilde bir sayfanız var ise tehlikedesiniz demektir.

Ben bu problemimi şu şekilde çözdüm ;

Sayfanın başında şu kontrolü yaptırıyorum :

$deger=mysql_real_escape_string($_GET[´aracno´]);
if (!ctype_digit($deger)) { header("Location:http://nursininsitesi.com"); }
mysql_query("SELECT * FROM cars WHERE id = ´$deger´ LIMIT 1 ");

Şu şekilde çalışıyor. Gelen verinin içindekilerin tamamı sayılardan oluşmuyorsa sayfayı hemen ana sayfaya yönlendiriyorum. Dolayısıyla sorgu çalışmamış oluyor ve saldırı sonucunda sitenizin veri bilgilerine ulaşamamış oluyorlar.

Dikkatle Teşekkürler:::... smiley

Gitme vakti gelince gitmek mi zordur kalmak mı?
05-02-2010 03:17

    nssasmaz Nursin Şaşmaz Avatar

    Güvenlik için başka yönetem bilenler varsa kesinlikle paylaşmalılar. Diğer üyelerimizdende rica etsek bilgileri olduğunca güvenlik hakkında da dökümanlar çok iyi olur.

    Gitme vakti gelince gitmek mi zordur kalmak mı?
    05-02-2010 04:04

      numara

      şöyle de olabilir.

      if(!is_numeric($_GET["numara"]))
      {
          echo "hooop hemşerim , kayıt numarası gelmedi !";
          exit;
      }

      Güvenliği sağlamak lazım ama Herkesin saldırgan olacağını düşünmeyin. linkleri yanlış kodladıysan normal üyeler de ne olduğunu bile anlamadan ana sayfaya yönlendirilir.
      Her programcı birgün Php yi tadacaktır
      05-02-2010 08:33

        nssasmaz Nursin Şaşmaz Avatar

        sütten dili yanan yoğurdu üfleyerek yermiş... smiley

        Gitme vakti gelince gitmek mi zordur kalmak mı?
        05-02-2010 10:42

          sdemirkeser Suleyman Demirkeser

          type casting yapilip direk int e donustururseniz zaten uygun degilse sifira donusmus olur

          $numara = (int) $_GET["numara"];

          05-02-2010 11:35

            soru

            ooo hocam siz cok ileride gidiyorsunuz hiç bişey anlamdım daha dizilerdeyim smiley

            05-02-2010 15:05

              Kunth Mesut Cemil ASLAN Avatar

              Ben genelde 


              mysql_query("SELECT * FROM cars WHERE id=´".$id."´ LIMIT 1");

              şeklinde kullanıyorum ve bunu injekte etmeye de çalıştım ama hiç problem olmadı şimdiye kadar ?

              Acep server side ayarlardan mı kaynaklanıyor injekte edemiyor olmam ?

              Kunth, just kunth...
              07-02-2010 03:13

                evt

                evet. birçok sunucuda koruma vardır.

                Nursin in dediği gibi, bizimki yoğurdu üfleyerek yemek.

                Her programcı birgün Php yi tadacaktır
                07-02-2010 09:36

                  Php

                  nacar Nejdet Acar

                  Yararlı bilgi için teşekkür ederim sayın Nursin Şaşmaz.

                  Php ye ilk başladığım zamanlarda bolca sql injection denemelerine maruz kalmış biri olarak bu tür kontrollerin değerini bilmek ve mutlaka kullanmak lazım diye düşünüyorum.

                  Ben önceleri yaptığım scriptlerde sadece mysql_real_escape_string kullanıyordım, bunu da öğrendiğim iyi oldu.

                  Teşekkür etmek için üye oldum ama sitenizi sık kullanılanlarıma ekledim bile.

                  Hörmetler...

                  04-11-2010 02:57 Edit:04-11-2010 02:59

                    www.Phpkodlari.com © 2009 Herkes Php öğrenecek
                    Web tasarım ve eğitim kaynağınız.