• 11-09-2012, 22:10:17
    #1
    S.A. Arkadaşlar,
    PHP'ye yeni başladım. Sıfırdan sayfalar kodluyorum ama acaba kodladığım sayfalarda SQL açığı oluşuyor mu bunu nasıl kontrol edebilirim? Nelere dikkat etmem gerekli?
    Bir de genel olarak nelere dikkat etmeliyim güvenlikle alakalı olarak?
    Şimdiden teşekkürler...
  • 11-09-2012, 22:34:08
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    R10 patlamadan önce bir yazı yazmıştım bununla ilgili. Klasik olarak Google'a sql injection yazıp aratsan milyonlarca örnek ve çözüm bulabilirdin demek istiyorum. Bu çok klasik ve kolayına kaçmak gibi görünse de doğrusu bu.

    Neyse konuya dönelim.

    SQL Injection, daha çok veritabanı sorgularıyla ilgili bir açık. Fazla konuşmadan örnek vereyim.

    Mesela kodların/sorgun şu şekilde:

    $id = $_GET['id'];
    
    mysql_query("SELECT * FROM kullanicilar WHERE id='$id'");
    Eğer get ile aldığın veriyi direkt olarak sorgunun içine dahil edersen neler olacak şimdi görelim.

    Diyelim ki id değeri 10

    mysql_query("SELECT * FROM kullanicilar WHERE id='10'");
    Sorunsuz bir sorgu oldu. Ama diyelim ki get ile aldığımız veri 10' olarak gönderilmiş. Bu kez ne olacak?

    mysql_query("SELECT * FROM kullanicilar WHERE id='10''");
    Sorun oluşacak. Bu şekilde sitenize saldıranlar çeşitli saldırılar yapabilecekler. Bu açığı kapatmanız lazım. Çok şey yapmanıza gerek yok. Bunu kapatmak için tek yapmanız gereken şu. " ve ' işaretlerini süzmek. İster toptan yokedin bunları isterseniz de başka değerlere çevirin. Ama sözkonusu mysql sorgusu olduğuna göre mysql connect kullanmışsınızdır. Bu durumda mysql_real_escape_string fonksiyonu bulunmaz nimet. Tek yapacağınız şu.

    $id = mysql_real_escape_string($_GET['id']);
    Böylece mysql sorgularına aykırı olabilecek her türlü girdi süzülecek, düzenlenecek ve $id değişkenine öyle atanacak. Sorun ortadan kalktı.

    Tam olarak SQL Injection olmasa da benzer bazı zararlı durumlar da var. Örneğin id değeri sadece sayı olacaksa (integer) kontrol etmeniz gerekir.

    $id = $_GET['id'];
    if(!is_int($id)){
    //integer değilse bunu yap
    }
    else{
    //integersa bunu yap
    }
    Artık o istediğin tür neyse bunu kendine göre değiştireceksin. Vs. Vs.

    Birşey daha. Google'a R10'a veya herhangi bir ilgili internet sitesinin arama bölümüne php güvenlik açıkları vs gibi bir sorgu gönderirsen inanki çok detaylı kaynaklar bulabilirsin. Yoksa kapris çekersin çok.

    Aklına takılanı sorabilirsin.
  • 11-09-2012, 22:43:34
    #3
    youtube da uygulamalı olarak nasıl yapıldığını anlatan videolar var, bunları izlersen nasıl önleyeceğini de anlarsın..
  • 12-09-2012, 02:15:47
    #4
    SQL Injection açıklarını bulmak kullanılan Acunetix programını tavsiye edebilirim. Acunetix bu işlemler için biçilmiş kaftandır.

    Çalışmalarınızda başarılar dilerim...
  • 12-09-2012, 02:23:22
    #5
    Üyeliği durduruldu
    Site içindeki tüm URL'leri çekip tüm GET işlemi yapılan URL'lerin sonuna ' ekleyen ve hata kontrol eden bir PHP yada program yazılabilir. Acunetixi bilmiyorum ama büyük ihtimalle bu dediğimi yapıyordur.

    ps. Açıkları kapatmak için ise arkadaşın dediği gibi mysql_real_escape_string kullanmalısınız.
  • 12-09-2012, 03:28:33
    #6
    Üyeliği durduruldu
    İşinize yarayabilir;


    http://www.youtube.com/watch?v=_dNLuvqhErc
  • 12-09-2012, 12:46:21
    #7
    Acunetix ile siteyi tarattım, 1 tane SQL Injection buldu

    O da kullanıcıdan telefon numarası girmenisi istediğim bir alan var buraya sadece sayı girişine izin vermem lazım ama harf fln da girebiliyor kullanıcı.

    Bunu nasıl yapabilirim?

    <?php
    $OgrNo=$_SESSION['OgrNo'];
    $GSMNo=$_GET['GSMNo'];
    if (isset($GSMNo))
    {
    $sorgu="UPDATE user SET CepTelNo='$GSMNo' WHERE OgrNo='$OgrNo'";
    $sonuc=mysql_query($sorgu);
    header('Location: profil.php');
    }
    echo "<p align='center' class='yazi'>GSM numaranızı başında sıfır (0) olmadan yazınız.</p>";
    ?>
  • 12-09-2012, 12:50:12
    #8
    Kimlik doğrulama veya yönetimden onay bekliyor.
    is_numeric kullansan?
  • 12-09-2012, 13:06:16
    #9
    CebR adlı üyeden alıntı: mesajı görüntüle
    is_numeric kullansan?
    Bu kadar kolay mıydı ya
    Acemilik işte hocam.
    Teşekkür ederim.