• 07-09-2010, 14:47:55
    #1
    merhabalar;

    biraz makale okuyordum güvenlikle ilgili ama aklım bir yerde karıştı yardımcı olursanız sevinirim arkadaslar ben şimdi

    inputlardaki name ile bile bilgileri gonderiyorum
    @$kullanici=addslashes(strip_tags(htmlspecialchars($_POST['kullanici'], ENT_QUOTES))); 
    @$sifre=$_POST['sifre'];
    Bu Şekildede Giriş Yaptırıyorum

     @$sifre=md5(md5($sifre)); 
     $sor=mysql_query("select kullanici,sifre from uyeler where kullanici='$kullanici' and sifre='$sifre'");
     if(@mysql_num_rows($sor)>0){
    Şimdi Okudugum makalede sql inject tam olarak boyle oluyormus
    örnek olarakta
    ‘ OR 1=1 ‘ şifre boyle girilirse kabul edecektir demiş deniyorum kabul etmıyor


    sonra $id değerlerini veya index.php?git=Buradaki değelreri değiştirebilirler diyor ama değiştirsede boş ekran çıkar Switchde gostermemişim zaten haksızmıyım ?
  • 07-09-2010, 15:14:34
    #2
    gkaradagan adlı üyeden alıntı: mesajı görüntüle
    merhabalar;

    biraz makale okuyordum güvenlikle ilgili ama aklım bir yerde karıştı yardımcı olursanız sevinirim arkadaslar ben şimdi

    inputlardaki name ile bile bilgileri gonderiyorum
    @$kullanici=addslashes(strip_tags(htmlspecialchars($_POST['kullanici'], ENT_QUOTES))); 
    @$sifre=$_POST['sifre'];
    Bu Şekildede Giriş Yaptırıyorum

     @$sifre=md5(md5($sifre)); 
     $sor=mysql_query("select kullanici,sifre from uyeler where kullanici='$kullanici' and sifre='$sifre'");
     if(@mysql_num_rows($sor)>0){
    Şimdi Okudugum makalede sql inject tam olarak boyle oluyormus
    örnek olarakta
    ‘ OR 1=1 ‘ şifre boyle girilirse kabul edecektir demiş deniyorum kabul etmıyor


    sonra $id değerlerini veya index.php?git=Buradaki değelreri değiştirebilirler diyor ama değiştirsede boş ekran çıkar Switchde gostermemişim zaten haksızmıyım ?
    or 1 = 1 hikayesi sorgulamadaki hatadan kaynaklanır.
    girişi databaseden ya da bir fonksiyondan gelen TRUE yanıtına bağlarsan
    or 1=1 olayı her zaman 0 or 1 den true döndürür.
    yani
     
    if($sife == $sifre){
    giriş yap
    }
    şeklinde kullananlar için açıktır o. çünkü o taktirde sorgu şifre = şifre ya da 1=1 şeklinde sorgulanır ve yanıt true döner giriş yapar.

    Sorguyu mysql_num_rows ile satır saydırarak yaptğında zaten o or1=1 açığı kapanmış olur.

    senin yaptığın filtreleme hala tehlikeli.
    database e sorgu göndermeden önce herşeyden önce mysql_real_escape_string fonksiyonundan geçir. strip_tags ve html_specialchars seni xss açıklarından korur, ama database e hala sorgu gidebilir.

    eleman kullanıcı adı olarak ahmet yerine
    ahmet'; TRUNCATE TABLE 'uyeler'; SELECT * uyeler WHERE sifre =
    gibi bir şey yaparsa arıza çıkabilir.

    Ayrıca her zaman formlarda veri denetimi yap. Mesela kullanıcı adı 15 karakterden uzunsa trim le kes.
    preg_match ile formdan gelen veri beklentilere uygun mu diye denetlemek lazım.
    mesela bir isim içinde harf ve sayı dışında karakter varsa ya da beklenilen uzunluğun dışındaysa kafadan reddetemk lazım.
  • 07-09-2010, 15:23:01
    #3
    teşekkurler demek istediginizi anladım halen adam oraya sql kodları yazabilir yani dediğiniz gibi kullanıcıdan aldıgım her verıye mysql_real_escape_string ile filitrelemem gerekiyor ?

    Örnekteki gibi
    @$kullanici=mysql_real_escape_string(addslashes(strip_tags(htmlspecialchars($_POST['kullanici'], ENT_QUOTES)))); 
    @$sifre=mysql_real_escape_string(addslashes(strip_tags(htmlspecialchars($_POST['sifre'])))); 
     if(($kullanici=="") or ($sifre=="")){
     ksgirisbos();
     }else{
     @$sifre=md5(md5($sifre)); 
     $sor=mysql_query("select kullanici,sifre from uyeler where kullanici='$kullanici' and sifre='$sifre'");
     if(@mysql_num_rows($sor)>0){
  • 07-09-2010, 16:12:00
    #4
    Evet hocam aynen öyle. mysql_real_escape_string ve addslashes ile girdiyi güvene almış oluyorsun.
    sadece get ve post değil manipüle edilebilecek ve database a giden herşeyi bu filtreden geçirmeni öneririm.

    $_COOKIES
    $_SERVER['USER_AGENT']
    $_SERVER['HTTP_REFERER']