PHP veritabanına güvenli bir şekilde veri ekleme

shiftgo

Centipat
Katılım
5 Ocak 2022
Mesajlar
28
Daha fazla  
Cinsiyet
Erkek
Merhaba. İyi sosyaller dilerim. PHP'ye yeni başlamış birisi olarak kafama takılan bir soruya cevap arıyorum. Aşağıda belirttiğim gibi veritabanına veri ekliyorum. Benim için herhangi bir hata veya problem oluşmuyor. Malum kodlar çok basit. Bu kadar basit olması bende şüphe uyandırıyor. Kodların bu kadar basit olması herhangi bir zafiyet oluşturur mu? Verilerimi kaydetmenin daha güvenli bir yolu var mıdır?

PHP:
<?php
if (isset($_POST["veri_ekle"]))
{
    $veri_ekle = $db->prepare("insert into VeriListesi set
    isim=:isim,
    soyisim=:soyisim
    ");
    $kontrol_et = $veri_ekle->execute(array(
    "isim" => $_POST["isim"],
    "soyisim" => $_POST["soyisim"]
    ));
   
    if($kontrol_et)
    {
        echo "veri eklendi";
    }
        else
        {
            echo "bir hata var gibi görünüyor.";
        }
       
    }
?>
 
Son düzenleyen: Moderatör:
htmlspecialchars(); kullanabilirsin.
PHP:
"isim" => htmlspecialchars($_POST["isim"]),
"soyisim" => htmlspecialchars($_POST["soyisim"])

Öncelikle teşekkür ederim. Dün bu konu hakkında çeşitli projelere bakarken şöyle basit bir proje buldum. Bahsettiğim proje. yorumları okuduğumda çok kolay bir şekilde SQL ınjection yapılabileceğinden bahsedilmiş. Bunu önleyebilmem adına önerebileceğiniz kaynak veya kaynaklar varsa belirtebilir misiniz?

CSRF token olayını öğrendim. Yeniyim diye sanırım kafamı karıştırdı biraz. Daha temelden anlamamı sağlayacak kaynak olursa çok sevinirim.
 
Son düzenleme:
Öncelikle teşekkür ederim. Dün bu konu hakkında çeşitli projelere bakarken şöyle basit bir proje buldum. Bahsettiğim proje. yorumları okuduğumda çok kolay bir şekilde SQL ınjection yapılabileceğinden bahsedilmiş. Bunu önleyebilmem adına önerebileceğiniz kaynak veya kaynaklar varsa belirtebilir misiniz?

CSRF token olayını öğrendim. Yeniyim diye sanırım kafamı karıştırdı biraz. Daha temelden anlamamı sağlayacak kaynak olursa çok sevinirim.
PHP:
htmlspecialchars($degisken, ENT_QUOTES);

Bu şekilde tırnak kullanımı engelleyebilirsin.

CSRF kullanımı için de login yaptırdığın kodların varsa gönderirsin ona göre örnek oluştururum. Anlamış olursun.
 
PHP:
htmlspecialchars($degisken, ENT_QUOTES);

Bu şekilde tırnak kullanımı engelleyebilirsin.

CSRF kullanımı için de login yaptırdığın kodların varsa gönderirsin ona göre örnek oluştururum. Anlamış olursun.

Öğrenirken şu şekilde öğrendim. Ne kadar sağlıklı olduğunu bilmiyorum. Şimdi sizden daha doğrusunu öğreneceğimi umuyorum.
giris.php


PHP:
<?php
if($_POST)
{
    $name =$_POST["kullanici_adi"];
    $pass =$_POST["kullanici_sifre"];


    $query  = $db->query("SELECT * FROM adminler WHERE kullanici_adi='$name' && kullanici_sifre='$pass'",PDO::FETCH_ASSOC);
    if ( $say = $query -> rowCount() ){

        if( $say > 0 ){
            session_start();
            $_SESSION['oturum']=true;
            $_SESSION['name']=$name;
            $_SESSION['pass']=$pass;
            
            header("Location:Yonetim-Paneli.php");
            
        }else{
            echo "oturum açılmadı hata";
        }
    }else{
        echo "<div style='color:red; height:40px; border-radius:20px; font-size:21px;'><p><center>Kullanıcı adı veya şifre hatalı</center></p></div>";
        echo "<hr>";
    }
}
else{}

?>

<form method="POST">
<div class="form-group">
    <input type="text" class="form-control" name="kullanici_adi" placeholder="Kullanıcı Adınız" />
</div>
<div class="form-group">
    <input type="password" class="form-control" name="kullanici_sifre" placeholder="Şifreniz" />
</div>

<div class="login-btn">
    <button class="btn btn-primary">Giriş Yap</button>
    <!--<span> Şifreni mi Unuttun?</span>
</div>-->
</form>


cikis.php

PHP:
<?php
session_start();
session_destroy();
session_unset();
unset($_SESSION['oturum']);
header("Location:index.php");
?>


Daha sonra giriş yapan kişinin erişmesini istediğim sayfaların en başına şu kodları ekliyorum. (nedenini bilmiyorum bu kodları ekleyince Technopat hata veriyor ve cevap veremiyorum. O yüzden resim olarak eklemek zorunda kaldım.)

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Kodlarını sadeleştirip, istediğin şekle getirdim. Yanlarına da açıklamalarını yazdım. Bu şekilde kullanırken CSRF Token kullanmana gerek yok. Takıldığın bir yer olursa veya çalışmazsa bana hata mesajını iletebilirsin. Aceleyle yaptım müsait değildim.

PHP:
<?php
if (isset($_POST)) { // post işlemi varsa işlemlere başladık.
    $name = htmlspecialchars($_POST["kullanici_adi"], ENT_QUOTES); // gelen kullanıcı adı verisini özel karakterlerden arındırarak değişkene atadık.
    $pass = htmlspecialchars($_POST["kullanici_sifre"], ENT_QUOTES); // gelen kullanıcı şifresi verisini özel karakterlerden arındırarak değişkene atadık.

    $sorgu = $db->prepare("SELECT * FROM adminler WHERE kullanici_adi=:kullanici_adi AND kullanici_sifre=:kullanici_sifre"); //sorgu oluşturduk ve parametrelerle veritabanı kontrolü yaptırdık.
    $sorgu->bindParam(':kullanici_adi', $name); // kullanici_adi parametresine $name değişkenini atadık.
    $sorgu->bindParam(':kullanici_sifre', $pass); // kullanici_sifre parametresine $pass değişkenini atadık.
    $sorgu->execute(); // derledik.

    if ($sorgu->rowCount() > 0) { //üstteki sorguya uyan 0'dan fazla bir kayıt olup olmadığını kontrol ettik.
        $sonuc = $sorgu->fetch(); //veritabanındaki verileri $sonuc değişkenine atadık.
        $_SESSION['oturum'] = true; // oturum sessionunu true yaptık kontrolü buradan yapabiliriz.
        $_SESSION['kullanici_adi'] = $sonuc['kullanici_adi']; // kullanici_adi sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_adi verisini atadık.
        $_SESSION['kullanici_sifre'] = $sonuc['kullanici_sifre']; // kullanici_sifre sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_sifre verisini atadık.(buna gerek yok şifreyi almasak da olur sadece örnek için ekledim)
        // $_SESSION['kullanici_diger_bilgi']     = $sonuc['kullanici_diger_bilgi'];
        // veritabanından kullanıcıya ait verileri burada verdiğim örnekle sessiona atayabilirsin.
        header("Location:Yonetim-Paneli.php"); // giriş yapan kullanıcıyı panele yönlendirdik.
    } else {
        echo "<div style='color:red; height:40px; border-radius:20px; font-size:21px;'><p><center>Kullanıcı adı veya şifre hatalı</center></p></div><hr>"; // hata mesajı yazdırdık.
    }
}
?>
 
Kodlarını sadeleştirip, istediğin şekle getirdim. Yanlarına da açıklamalarını yazdım. Bu şekilde kullanırken csrf token kullanmana gerek yok. Takıldığın bir yer olursa veya çalışmazsa bana hata mesajını iletebilirsin. Aceleyle yaptım müsait değildim.

PHP:
<?php
if (isset($_POST)) { // post işlemi varsa işlemlere başladık.
 $name = htmlspecialchars($_POST["kullanici_adi"], ENT_QUOTES); // gelen kullanıcı adı verisini özel karakterlerden arındırarak değişkene atadık.
 $pass = htmlspecialchars($_POST["kullanici_sifre"], ENT_QUOTES); // gelen kullanıcı şifresi verisini özel karakterlerden arındırarak değişkene atadık.

 $sorgu = $db->prepare("SELECT * FROM adminler WHERE kullanici_adi=:kullanici_adi AND kullanici_sifre=:kullanici_sifre"); //sorgu oluşturduk ve parametrelerle veritabanı kontrolü yaptırdık.
 $sorgu->bindParam(':kullanici_adi', $name); // kullanici_adi parametresine $name değişkenini atadık.
 $sorgu->bindParam(':kullanici_sifre', $pass); // kullanici_sifre parametresine $pass değişkenini atadık.
 $sorgu->execute(); // derledik.

 if ($sorgu->rowCount() > 0) { //üstteki sorguya uyan 0'dan fazla bir kayıt olup olmadığını kontrol ettik.
 $sonuc = $sorgu->fetch(); //veritabanındaki verileri $sonuc değişkenine atadık.
 $_SESSION['oturum'] = true; // oturum sessionunu true yaptık kontrolü buradan yapabiliriz.
 $_SESSION['kullanici_adi'] = $sonuc['kullanici_adi']; // kullanici_adi sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_adi verisini atadık.
 $_SESSION['kullanici_sifre'] = $sonuc['kullanici_sifre']; // kullanici_sifre sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_sifre verisini atadık.(buna gerek yok şifreyi almasak da olur sadece örnek için ekledim)
 // $_SESSION['kullanici_diger_bilgi'] = $sonuc['kullanici_diger_bilgi'];
 // veritabanından kullanıcıya ait verileri burada verdiğim örnekle sessiona atayabilirsin.
 header("Location:Yonetim-Paneli.php"); // giriş yapan kullanıcıyı panele yönlendirdik.
 } else {
 echo "<div style='color:red; height:40px; border-radius:20px; font-size:21px;'><p><center>Kullanıcı adı veya şifre hatalı</center></p></div><hr>"; // hata mesajı yazdırdık.
 }
}
?>

Zaman ayırıp teker teker açıklama yapmışsınız çok teşekkür ederim. İlk denediğimde şu şekilde hata verdi.

Kod:
Warning: Undefined array key "kullanici_adi" in C:\xampp\htdocs\taslakprojem\giris-yap.php on line 24.

Warning: Undefined array key "kullanici_sifre" in C:\xampp\htdocs\taslakprojem\giris-yap.php on line 25

İf (isset($_post)) --> if($_post) şeklinde değiştirince hata kalkıyor. Bu şekilde kullanılması bir problem oluşturur mu yoksa zaten doğrusu mu bu?

Ayrıca doğru bilgilerle giriş yaptığımda giriş yapmıyordu.
$_sessıon['oturum'] = true; üstüne session_start(); ekleyince normal bir şekilde giriş yapar oldu. Şuan da herhangi bir hata yok.

İf (isset($_post)) --> if($_post) mevzusuna açıklık getirilirse mutlu olurum.
Zaman ayırdığınız için size tekrardan çok teşekkür ediyorum.
 
Şöyle bir değişiklik yapalım tam olarak düzgün çalışsın o zaman:
Giriş formuyla kontrol sayfasını ayıralım.

giris.php :
PHP:
<?php
session_start();
if (!empty($_SESSION['oturum'])) { // empty = boşsa / !empty = boş değilse / isset = varsa / !isset = yoksa. Başına ünlem geliyorsa o durumun tersini yansıtır.
    header("Location:Yonetim-Paneli.php"); // eğer oturum boş değilse panele yönlendirdik.
} ?>

<form action="islem.php" method="POST">
  <div class="form-group">
    <input type="text" class="form-control" name="kullanici_adi" placeholder="Kullanıcı Adınız" />
  </div>
  <div class="form-group">
    <input type="password" class="form-control" name="kullanici_sifre" placeholder="Şifreniz" />
  </div>
  <div class="login-btn">
    <input type="submit" class="btn btn-primary" value="Giriş Yap">
    <!--<span> Şifreni mi Unuttun?</span></div>-->
</form>

islem.php :

PHP:
<?php
session_start();
if (isset($_POST['submit'])) { // eğer gelen bir submit varsa aşağıdaki kodları çalıştırdık.
    $name = htmlspecialchars($_POST["kullanici_adi"], ENT_QUOTES); // gelen kullanıcı adı verisini özel karakterlerden arındırarak değişkene atadık.
    $pass = htmlspecialchars($_POST["kullanici_sifre"], ENT_QUOTES); // gelen kullanıcı şifresi verisini özel karakterlerden arındırarak değişkene atadık.

    $sorgu = $db->prepare("SELECT * FROM adminler WHERE kullanici_adi=:kullanici_adi AND kullanici_sifre=:kullanici_sifre"); //sorgu oluşturduk ve parametrelerle veritabanı kontrolü yaptırdık.
    $sorgu->bindParam(':kullanici_adi', $name); // kullanici_adi parametresine $name değişkenini atadık.
    $sorgu->bindParam(':kullanici_sifre', $pass); // kullanici_sifre parametresine $pass değişkenini atadık.
    $sorgu->execute(); // derledik.

    if ($sorgu->rowCount() > 0) { //üstteki sorguya uyan 0'dan fazla bir kayıt olup olmadığını kontrol ettik.
        $sonuc = $sorgu->fetch(); //veritabanındaki verileri $sonuc değişkenine atadık.
        $_SESSION['oturum'] = true; // oturum sessionunu true yaptık kontrolü buradan yapabiliriz.
        $_SESSION['kullanici_adi'] = $sonuc['kullanici_adi']; // kullanici_adi sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_adi verisini atadık.
        $_SESSION['kullanici_sifre'] = $sonuc['kullanici_sifre']; // kullanici_sifre sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_sifre verisini atadık.(buna gerek yok şifreyi almasak da olur sadece örnek için ekledim)
        // $_SESSION['kullanici_diger_bilgi']     = $sonuc['kullanici_diger_bilgi'];
        // veritabanından kullanıcıya ait verileri burada verdiğim örnekle sessiona atayabilirsin.
        header("Location:Yonetim-Paneli.php"); // giriş yapan kullanıcıyı panele yönlendirdik.
    } else {
        echo "<div style='color:red; height:40px; border-radius:20px; font-size:21px;'><p><center>Kullanıcı adı veya şifre hatalı yönlendiriliyorsunuz...</center></p></div><hr>"; // hata mesajı yazdırdık.
        // BU YORUM SATIRININ YERİNE AŞAĞIDA VERDİĞİM KODU GİRMELİSİN.
    }
}
?>

Technopat hatası nedeniyle yazamadığım için yorum satırına ekleyeceğin kod burada:
[MEDIA]
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.


Giriş formuna action ve submit butonu ekledik. islem.php içerisine de eğer submit yapıldıysa kontrolü yaptık.

Ayrıca formun üstüne bir de oturum kontrolü ekledik. Yani daha önceden giriş yapmış birisi giris.php sayfasına girmeye çalışırsa otomatik olarak panele yönlendirilecek. Eğer giriş yapılmamışsa form gözükecek.

Test edip haber verirsin. Kolay gelsin.
 
Son düzenleme:
Şöyle bir değişiklik yapalım tam olarak düzgün çalışsın o zaman:
Giriş formuyla kontrol sayfasını ayıralım.

giris.php:
PHP:
<?php
session_start();
if (!empty($_SESSION['oturum'])) { // empty = boşsa / !empty = boş değilse / isset = varsa / !isset = yoksa. Başına ünlem geliyorsa o durumun tersini yansıtır.
 header("Location:Yonetim-Paneli.php"); // eğer oturum boş değilse panele yönlendirdik.
} ?>

<form action="islem.php" method="POST">
 <div class="form-group">
 <input type="text" class="form-control" name="kullanici_adi" placeholder="Kullanıcı Adınız" />
 </div>
 <div class="form-group">
 <input type="password" class="form-control" name="kullanici_sifre" placeholder="Şifreniz" />
 </div>
 <div class="login-btn">
 <input type="submit" class="btn btn-primary" value="Giriş Yap">
 <!--<span> Şifreni mi Unuttun?</span></div>-->
</form>

islem.php:

PHP:
<?php
session_start();
if (isset($_POST['submit'])) { // eğer gelen bir submit varsa aşağıdaki kodları çalıştırdık.
 $name = htmlspecialchars($_POST["kullanici_adi"], ENT_QUOTES); // gelen kullanıcı adı verisini özel karakterlerden arındırarak değişkene atadık.
 $pass = htmlspecialchars($_POST["kullanici_sifre"], ENT_QUOTES); // gelen kullanıcı şifresi verisini özel karakterlerden arındırarak değişkene atadık.

 $sorgu = $db->prepare("SELECT * FROM adminler WHERE kullanici_adi=:kullanici_adi AND kullanici_sifre=:kullanici_sifre"); //sorgu oluşturduk ve parametrelerle veritabanı kontrolü yaptırdık.
 $sorgu->bindParam(':kullanici_adi', $name); // kullanici_adi parametresine $name değişkenini atadık.
 $sorgu->bindParam(':kullanici_sifre', $pass); // kullanici_sifre parametresine $pass değişkenini atadık.
 $sorgu->execute(); // derledik.

 if ($sorgu->rowCount() > 0) { //üstteki sorguya uyan 0'dan fazla bir kayıt olup olmadığını kontrol ettik.
 $sonuc = $sorgu->fetch(); //veritabanındaki verileri $sonuc değişkenine atadık.
 $_SESSION['oturum'] = true; // oturum sessionunu true yaptık kontrolü buradan yapabiliriz.
 $_SESSION['kullanici_adi'] = $sonuc['kullanici_adi']; // kullanici_adi sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_adi verisini atadık.
 $_SESSION['kullanici_sifre'] = $sonuc['kullanici_sifre']; // kullanici_sifre sessionuna veritabanında giriş yapan kullanıcıya ait kullanici_sifre verisini atadık.(buna gerek yok şifreyi almasak da olur sadece örnek için ekledim)
 // $_SESSION['kullanici_diger_bilgi'] = $sonuc['kullanici_diger_bilgi'];
 // veritabanından kullanıcıya ait verileri burada verdiğim örnekle sessiona atayabilirsin.
 header("Location:Yonetim-Paneli.php"); // giriş yapan kullanıcıyı panele yönlendirdik.
 } else {
 echo "<div style='color:red; height:40px; border-radius:20px; font-size:21px;'><p><center>Kullanıcı adı veya şifre hatalı yönlendiriliyorsunuz...</center></p></div><hr>"; // hata mesajı yazdırdık.
 // BU YORUM SATIRININ YERİNE AŞAĞIDA VERDİĞİM KODU GİRMELİSİN.
 }
}
?>

Technopat hatası nedeniyle yazamadığım için yorum satırına ekleyeceğin kod burada:
[MEDIA]
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Giriş formuna Action ve submit butonu ekledik. islem.php içerisine de eğer submit yapıldıysa kontrolü yaptık.

Ayrıca formun üstüne bir de oturum kontrolü ekledik. Yani daha önceden giriş yapmış birisi giris.php sayfasına girmeye çalışırsa otomatik olarak panele yönlendirilecek. Eğer giriş yapılmamışsa form gözükecek.

Test edip haber verirsin. Kolay gelsin.

Bu sefer sorun olmadan çalıştı. Tekrardan ve tekrardan çok teşekkür ederim. 😊

İyi günler, iyi sosyaller dilerim. 😇
 

Geri
Yukarı