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 " = " ve < = <
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.