Merhaba arkadaşlar blogumun ilk yazısını sonunda yazmış bulunmaktayım, "prepare ile sql injection engelleme (PDO)" olsun istedim, bu konuda fazla detaya inmiycem uzun uzun anlatmayı pek sevmiyorum zaten anlatımda pek iyi sayılmam gene elimden geldiği kadar açık ve anlaşılır anlatmaya çalışacağım.
Neyse uzatmadan konumuza geçelim.
Sql injection saldırılarını bilmeyen varsa şuraya bir kaynak bırakıyorum
Sql injection nedir?
Öncelikle elimizde söyle bir veritabanımız mevcut arkadaşlar 'bu nasıl veri tabanı aq' dediginizin farkındayım neyse bu benim oluşturuduğum bir veri tabanı, biraz sallamasyon oldu idare edin
Şimdi veritabanımıza PDO ile bağlanıyoruz ve baglantı hatalarını yakalıyoruz.
<?php
try {
$bagla = new PDO("mysql:hostname=localhost:85; dbname=star veri; charset=utf8", "root", "");
}catch(PDOException $exe){
echo $exe->getMessage();}
?>
PDO ne diye bilmeyenler için kısa bir bilgi vereyim ;
PDO nedir?
PDO(PHP Data Objects / PHP Veri Objeleri)
“Object Oriented Programming” arayüzüne sahip, onlarca veritabanı sürücüsünü destekleyen ve erişim sağlayan bir arayüz.(Php eklentisidir.)
Yukarıdaki kodları açacak olursak arkadaşlar;
"star veri" adında bir veri tabanımız var ve biz bu veri tabanında bulunan " star" adındaki tablonun verilerini çekecegiz $bagla = new PDO("mysql:hostname=localhost:85; dbname=star veri; charset=utf8", "root", "");
veri tabanımızı PDO ile bağladık , baglama işlemini yaparken "$bagla" adında bir degişken kullandık daha sonra Veritabanı bağlantısında olası hataları yakalamak için try & catch kullandık ve hata almamak için Karakter Setini UTF8 olarak belirledik.
Şimdi geldik sql injection'a sebeb olan kodlarımıza
<?php
try {
$id = @$_GET["id"];
query = $bagla->query("select * from star where id=$id");
query->execute();
while($row = $query->fetch()){echo $row["Ana Sayfa"]."}
}catch(PDOexception $exe){echo $exe->getMessage();}
?>
Yukarıdaki kodları çalıştırdıgımız zaman web sitemizde kocaman bir sql injection açığı bulunacak
Gördügünüz gibi sql hatası verdi.
Arkadaşlar buna sebeb olan metodumuz query dir.
PHP’de kendi resmi dökümantasyonunda bile artık uyarı verilmekte, mysql_connect“, “mysql_query” fonksiyonlarını kullanmanızı önermiyorlar.
Yukarıdaki hataya sebeb olan metodumuza kısa bir bakış atalım:
$id = @$_GET["id"];
$query = $bagla->query("select * from star where id=$id");
Kodlarımızı açıklayalım, bir GET tanımladık daha sonra sorgumuzu yazdık, siz isterseniz POST tanımlaya bilirsiniz, GET ve POST arasındaki fark biri ön planda diğeri ise arka planda çalışır ama işlev olarak bir biriyle aynı işlevi görürler. (GET :ön plan , POST : arka plan )
Bu kullanım eski kullanımlardan biridir arkadaşlar sorgumuzu query metodu ile oluşturup $id değişkenimizi sorgumuzun içine yazdıgımız zaman bizim sistemimizi sql injection'a açık hale getiriyor.
Bunun sebebi ise query metodu basit bir "SELECT " sorgusu oluşturur ve veritabanından istenilen sütunları bir "String dizisi" şeklinde alır.
Buda bizim sayfamızda sql injection hatası almamıza sebeb olur. Sql hataları genellikle string hataları olarak bilinir yukarıdaki SQL injection kaynağını okuduğunuz zaman olayı daha iyi kavrayacaksınız.
Şimdi gelelim bunu engellemeye.
<?php
try {
$id = @$_GET["id"];
$query = $bagla->prepare("select * from star where id=?");
$query->execute(array($id ));
while($row = $query->fetch()){echo $row["Ana Sayfa"];
}
} catch(PDOexception $exe){echo $exe->getMessage();
}
?>
Evet şimdi kodlarımızı inceleyelim az evvel "query " yerine "prepare" metodu geldiğini görüyoruz, aynı zamanda "$id" degişkenimizin yerinede "id=?" soru işareti geldiğini görüyoruz.
Arkadaşlar "prepare" metodumuz sql injectionu engelleyen metodu muzdur.
Bunu kısaca açıklayacak olursak prepare() metodu bindparam(),execute(), bindColumn(), bindValue() metotları ile beraber çalışır ve dışarıdan SQL sorgularına dahil edilecek veriler için iki tür tanım yapmayı sağlar. Bu tanımlardan birisi soru işaretidir, diğeri ise önünde iki nokta üst üste olan herhangi bir isim veya değerdir
Bu şekilde sql injection saldırılarını engeller.
Yukarıdaki kodlarımızı çalıştıralım;
Gördüğünüz gibi ne kadar tırnak atarsa atsın saldırğanımız hiç bir şekilde verilerimize ulaşamayacak ve biz sistemimizi korumuş olacağız.
Umarım anlata bilmişimdir. Sağlıcakla kalın..