• 31-01-2021, 03:46:00
    #1
    Forum cevaplarını sorunsuz bir şekilde listeliyorum. ama onun içindede bir listeleme yapmak istiyorum cevabı gönderen öğrencinin fotoğrafını gösterecem. ogrenciad='".$cevap['gonderen']. bunu yaptım olmuyor. bunun yerine nasıl bir kod koymam gerekiyor. ?


      <?php 
    $sorgu=$db->prepare("SELECT * FROM forumcevap WHERE konu='".$forum['id']."'  ");   
     $sorgu ->execute(array(":konu" =>$forum['id']));
        $cevaplar=$sorgu-> fetchAll(PDO::FETCH_OBJ); ?>
    
      
                 
               
                  <?php foreach($cevaplar as $cevap) { ?>
                      <?php 
    
        
    $sorgu=$db->prepare("SELECT * FROM ogrenci WHERE ogrenciad='".$cevap['gonderen']."'  ");   
     $sorgu ->execute(array(":ogrenciad" =>$cevap['gonderen']));
        $ogrenci=$sorgu-> fetchAll(PDO::FETCH_OBJ); ?>
                         <?php foreach($ogrenci as $ogrenci) { ?>
          <div class="media">
            <div class="media-left center">
              <img src="../img/kullanici/" alt="" class="img-circle" width="40">
            </div>
            <div class="media-body">
              <div class="card">
                <div class="p-a-1">
                  <p>
                    <a href="#"><?=$cevap->gonderen?></a>
                    <small class="text-muted"><?=$cevap->tarih?></small>
                  </p>
                  <p>
                    "<?=$cevap->yazi?>"
                  </p>
              
                </div>
              </div>
            </div>
          </div>
             <?php }   ?>   <?php }   ?>
  • 31-01-2021, 03:52:10
    #2
    Hocam bunu nereye yazıyorsun bilmiyorum ama bir ton SQL injection var. Bu tür açıkların bulunduğu bir yazılımı okula falan yazmıyorsundur umarım.
  • 31-01-2021, 04:06:02
    #3
    sumer-bilisim adlı üyeden alıntı: mesajı görüntüle
    Hocam bunu nereye yazıyorsun bilmiyorum ama bir ton SQL injection var. Bu tür açıkların bulunduğu bir yazılımı okula falan yazmıyorsundur umarım.
    yok bir okul veya kurum için değil ogrenci tablosu daha sonra değişecek
  • 31-01-2021, 04:26:48
    #4
    sumer-bilisim adlı üyeden alıntı: mesajı görüntüle
    Hocam bunu nereye yazıyorsun bilmiyorum ama bir ton SQL injection var. Bu tür açıkların bulunduğu bir yazılımı okula falan yazmıyorsundur umarım.
    ayrıca söz ettiğin açığı Htaccess ile daha sonra kapatamaz mıyım ?
  • 31-01-2021, 05:12:47
    #5
    <?php
    function getUser($id){ //Öğrenci bilgilerini çekebileceğiniz basit bir fonksiyon.
    GLOBAL $db; //DB değişkenini burada da tanımla
    $sorgu = $db->prepare("SELECT * FROM forumcevap WHERE gonderen=:id"); //Sorguyu prepare et
    $sorgu->bindParam(':id', $id, PDO::PARAM_INT); //Yükle
    $sorgu->execute(); //Çalıştır
    return $sorgu->fetch(PDO::FETCH_ASSOC); //Çek ve gelen değeri döndür
    }
    
    $sorgu = $db->prepare("SELECT * FROM forumcevap WHERE konu=:konuid"); //Sorguyu prepare et
    $sorgu->bindParam(':konuid', $forum['id'], PDO::PARAM_INT); //Yükle
    $sorgu->execute(); //Çalıştır
    
    ?>
    
    <?php while($cevap = $sorgu->fetchAll(PDO::FETCH_ASSOC)) { //Çek ve döngüye sok
    $ogrenci = getUser($cevap["gonderen"]); //ÖĞRENCİYİ İSİMLE DEĞİL ID İLE SORGULAYIN, CEVAP TABLOSUNA ÖĞRENCİ ID YAZDIRIN
    ?>
    <div class="media">
    <div class="media-left center">
    <img src="../img/kullanici/<?=$ogrenci['photoUrl'] ?>" alt="" class="img-circle" width="40">
    </div>
    <div class="media-body">
    <div class="card">
    <div class="p-a-1">
    <p>
    <a href="#"><?=$cevap["gonderen"] ?></a>
    <small class="text-muted"><?=$cevap["tarih"] ?></small>
    </p>
    <p><?=$cevap["yazi"] ?></p>
    </div>
    </div>
    </div>
    </div>
    <?php } ?>
    Diğer kodlarınızda problem yoksa bu şekilde çalışması gerekiyor, PDO kullanımı hakkında kısa tutorialler izlemenizi/makaleler okumanızı öneririm, güvenlik açısından çok önemli bir konu.
  • 31-01-2021, 15:25:44
    #6
    Hocam emek verdiniz yazdınız teşekkür ederim. benim gönderdiğim kodlar bir forum-detay.php sayfasıydı. Burda listelemek için 3 tablo kulllandım.

    1. forum tablosunda tek bir konuyu idye göre get yaptım.
    2. bu konuya verilen cevapları da forumcevap tablosundaki konu sütununda detaylandırılan konunun idsini içeriyorsa listele diye. konu='".$forum['id']."'

    buraya kadar sıkıntı yok zaten listelemeyi yaptım.
    3.olarak öğrenci konuya cevap verince kendi id sini veya adını forumcevap tablosunun gonderen sutununa ekliyor. ogrencinin ogrencifoto sunu göstermek istedim sadece - takıldığım yer buydu.


    Güvenlik konusuna gelince SQL injection mevzusunu dünden beri baya araştırdım okudum izledim. şimdi ben burda .php?id=1 yollarını ortadan kaldırırsam bu sorun kalkarmı ortadan ?
  • 31-01-2021, 22:10:29
    #7
    ahmetderyalar adlı üyeden alıntı: mesajı görüntüle
    Hocam emek verdiniz yazdınız teşekkür ederim. benim gönderdiğim kodlar bir forum-detay.php sayfasıydı. Burda listelemek için 3 tablo kulllandım.

    1. forum tablosunda tek bir konuyu idye göre get yaptım.
    2. bu konuya verilen cevapları da forumcevap tablosundaki konu sütununda detaylandırılan konunun idsini içeriyorsa listele diye. konu='".$forum['id']."'

    buraya kadar sıkıntı yok zaten listelemeyi yaptım.
    3.olarak öğrenci konuya cevap verince kendi id sini veya adını forumcevap tablosunun gonderen sutununa ekliyor. ogrencinin ogrencifoto sunu göstermek istedim sadece - takıldığım yer buydu.


    Güvenlik konusuna gelince SQL injection mevzusunu dünden beri baya araştırdım okudum izledim. şimdi ben burda .php?id=1 yollarını ortadan kaldırırsam bu sorun kalkarmı ortadan ?
    $sorgu=$db->prepare("SELECT * FROM forumcevap WHERE konu='".$forum['id']."'  "); //Forum ID'yi direkt belirtmişsiniz
    $sorgu ->execute(array(":konu" =>$forum['id'])); //Yukarıda form id'yi direkt atmak yerine :konu şeklinde yazsaydınız bu arrayin bir anlamı olurdu
    Üstteki kodda hata var, zaten forum ID'yi array ile ekleyebilecekken siz direkt eklemişsiniz. Şimdi buraya gelen veri GET'ten geliyorsa bu durumda kötü amaçlı kullanıcılar GET ID kısmına injection komutları uygulayarak veri tabanınıza sorgu gönderebilirler. PDO kullanmanız injection olayını büyük oranda engelliyor fakat kullanımınız yanlış olduğu için bir etkisi kalmıyor, o kodu şu şekilde düzenlerseniz PDO'nun anlamı olacak.
    if (is_numeric($forum['id'])){ //is_numeric() Kullanarak gelen verinin sayısal olup olmadığını kontrol ettik.
    $forumid = temizle($forum['id']); //Aşağıdaki örnekte "temizle" fonksiyonuna örnek vereceğim
    $sorgu=$db->prepare("SELECT * FROM forumcevap WHERE konu=:id");
    $sorgu->bindParam(':id', $forumid, PDO::PARAM_INT);
    $sorgu ->execute();
    }
    else echo "Geriye bir hata döndür";
    Ayrıca formdan veri alırken direkt $input = $_POST["inputName"]; şeklinde kullanmak yerine bunu süzgeçten geçirin, örneğin;
    $studentName = temizle($_POST["studentName"]); //Temizle fonksiyonunu kullanarak formdan gelen veriyi değişkene atadık
    //Değişkeni mutlaka "temizledikten" sonra veri tabanı işlemlerine koyarız.
    
    function temizle($data){
    $data = trim($data); //Trimleyerek white-space'leri temizledik
    $data = stripslashes($data); //Slash(\)'leri temizledik
    $data = htmlspecialchars($data); //HTML kodlarını temizledik, örneğin " = &quot; ve < = &lt;
    return $data;
    }
    Sorgunuza dışarıdan veri almadığınız zamanlarda direkt query ile execute edebilirsiniz fakat dışarıdan bir tane bile veri geliyorsa mutlaka prepare edin, formdan geliyorsa süzgeçten geçirin ve bindParam ile tür beslemesi yapın.
  • 31-01-2021, 22:21:44
    #8
    teşekkür edeirm
  • 31-01-2021, 22:35:42
    #9
    ahmetderyalar adlı üyeden alıntı: mesajı görüntüle
    teşekkür edeirm
    Rica ederim, iyi çalışmalar.