• 01-08-2008, 09:31:52
    #1
    Alıntı
    Eksik / Yanlış Bilgilendirme Görürseniz Lütfen Belirtin

    PHP SQL Injection Açığı Bırakmamak İçin Dikkat Edilmesi Gereken 2 Nokta.


    Evet bayanlar ve baylar, sahnede ben olmak üzere sizlerin güvenlik konusunda bilgilenmesi için bu dökümanda sql injection'a değineceğim. (accayip havali oldu )
    PHP & MySQL ikilisiyle birçoğumuz içli-dışlıdır. Lâkin bu güzel uygulamalarımızda düştüğümüz (yada düştüğünüz ) güvenlik açıkları arasında
    en çok yer kaplayan sql injection'dır.

    [+] Escape Kullanın.
    Neden escape kullanmaliyiz? çünkü bazı karakterleri olduğu gibi çalıştırırsak get veya post metoduyla beraber sql kodları çalıştırabilirler.
    burdaki mantık bir önceki sorguyu tırnak isareti ile kapatmaktir.

    örneğin bir admin.php sayfamız bulunsun
    admin.php?yonetici=admin&sifre=12345
    gibi. veya post metoduyla calissin. post'a yazarsiniz sql injection'ı. gönderirsiniz : )

    SELECT * FROM yonetim WHERE yonetici='$yonetici' , sifre='$sifre'
    olsun. burda adam tırnak isareti v.b. gonderebilirse nolur ?
    yonetici yerine doomsday'/* yazarsa ne olur bilir misiniz?
    SELECT * FROM yonetim WHERE yonetici='doomsday'/* , sifre='$sifre'
    gibi olur. ve doomsday adında bir yonetici varsa (yönetici adları genelde bellidir.. admin vs..) işte direk sorgu'nun değeri 0'dan büyük olur.
    sorgu olumlu sonuca ulaşmış olur. şifre sormadan direk login olmuş olursunuz : )

    tabii bu benim aklimda kalan baska biryerde gördüğüm ufak bi örnekdi.. bu sekilde basit sql injection.. bu gelişebilir. direk union select kullanımı yapılıp
    saldırı yapılabilir. işte bunun gibi durumlar için mutlaka mysql_real_escape_string(); fonksiyonunu eksik etmiyoruz : )
    bu bizim süzgeçimiz. gelen değeri bundan geçirip gönderdiğimizde..
    mesela;
    admin'/*...
    gibi geldi. işte süzgeçden geçince bu veri
    admin\'/*
    haline gelecek.


    [+] ID'leri alırken tamsayı olarak alın ve tırnak işareti kullanın.

    Çok fazla ayrıntıya girmiyorum, sadece korunmasını anlatıp , burda saldırı yöntemleri vermemek için.
    ancak şöyle diyeyim. burdaki mantık saldırganın sorgunuzu boşa düşürmemesidir.
    siz direk geleni alırsanız saldırgan arkadaşımız buraya integer olmayan bir değer verip sizin ilk select'inizi boş cevaba sürükler ve sadece peşine kendisinin
    girdiği union select sonuçlarını alır.
    intval(); fonksiyonunu kullanabilirsiniz.


    SELECT * FROM tablo_adi WHERE id=$gelen
    gibi kullanımlardan kaçının.
    SELECT * FROM tablo_adi WHERE id='$gelen'
    gibi olsun.

    neden mi ? çünkü sorgunuzda zaten tırnak işareti yoksa; mysql_real_escape_string(); kullanmanında pek yararı olmayacaktir : )
    tırnak işareti olursa saldırgan kendi sorgusunu çalıştırmadan önce sizin sorgunuzu bitirmesi gerekir. ve bir tırnak işaretine ihtiyac duyar. ancak mysql_real_escape
    bu tırnak işaretini escape eder. tabi eger intval kullandiysaniz escape'e gerek yoktur.
  • 01-08-2008, 09:41:30
    #2
    Üyeliği durduruldu
    Yararlı bilgi olmuş biz onun için bir fonksiyon yazdık

    getleri ve postları hem kısalttık hem güvenli hala geldik

    örn olarak mesela getleri := $_GET['id'] yerine $Gid yaptık
  • 01-08-2008, 09:57:20
    #3
    Yeşil SEO İnt. Hiz.
    hoş olmuş eline sağlık...
  • 01-08-2008, 13:08:02
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    filtrelemek için array_map fonksiyonu çok işe yarıyor
    mesela 50 tane veri post ediyorsunuz hepsini aynı fonksiyondan geçirmek hamallıktan başka hiçbişi olmaz burada array_map yardımımıza koşuyor

    $_POST = array_map("mysql_real_escape_string",$_POST);
    gibi..
  • 02-08-2008, 15:51:30
    #5
    aslina bakarsaniz asil değinmek istediğim mysql_real_escape_string()'inde tek başina yeterli olmayacağını göstermekdi. ama böyle oldu işte : )
  • 30-11-2009, 18:06:24
    #6
    Kimlik doğrulama veya yönetimden onay bekliyor.
    $id1=mysql_real_escape_string($_GET[id]);
    $id=intval($id1);
    $xx=mysql_query("SELECT * FROM xxxxx where id='$id'");

    bu sekılde yapmanın + ve - leri nelerdir cok basım yandı arastırdım en garantti yol bu gıbı gorunuyor sizin yorumlarınız nedır
  • 30-11-2009, 19:17:37
    #7
    Üyeliği durduruldu
    DooMsDaY adlı üyeden alıntı: mesajı görüntüle
    aslina bakarsaniz asil değinmek istediğim mysql_real_escape_string()'inde tek başina yeterli olmayacağını göstermekdi
    kesinlikle tek başına güvenli değil zaten. injectiondan kurtulmak için en basitinden kendinden sonraki kodun açıklama satirina dönüşmesini sağlayan # -- gibi karekterler bile önemlidir. Bir eğitim video seti şeklinde cd hazirlamistim

    https://www.r10.net/php/490072-hersey...udan-ucuz.html

    ilgilenenler için
  • 30-11-2009, 22:18:50
    #8
    xRaykan adlı üyeden alıntı: mesajı görüntüle
    $id1=mysql_real_escape_string($_GET[id]);
    $id=intval($id1);
    $xx=mysql_query("SELECT * FROM xxxxx where id='$id'");

    bu sekılde yapmanın + ve - leri nelerdir cok basım yandı arastırdım en garantti yol bu gıbı gorunuyor sizin yorumlarınız nedır

    pekı bu sekılde yaptıgımızda sızce guvenlımı ?
  • 30-11-2009, 22:42:52
    #9
    Üyeliği durduruldu
    1000 kişi bakmış 7 yorum eline sağlık kardeşim
    herhalde fazla sitesinin güvenliğini düşünen yok gibi