Uzun bir ara oldu yazmayalı, iş-güç derken baya boşladım blogumu. Ayrıca, yazmak istediğim konulara dair pek bir kararsızdım. En sonunda PDO ya dair yazılar yazarak devam etmeye karar verdim.
Daha önce PDO ile ilgili yazılar yazmıştım, konuyu tamamlamak adına birkaç şey var, onları dilimin döndüğünce aktarmaya çalışacağım.
Güvenlik önemli bir unsur, web uygulamalarımızda her zaman karşı kaşıya kaldığımız bir konudur. Güvenlik açıklarından biri SQL Injection, yani SQL aşılamadır.
SQL Injection’ı, veritabanından veri çekmek için kullandığımız SQL sorgularının istemediğimiz biçimde değiştirilmesi olarak özetleyebiliriz.
Bir örnek ile olaya daha yakından bakalım :
Daha önce PDO ile ilgili yazılar yazmıştım, konuyu tamamlamak adına birkaç şey var, onları dilimin döndüğünce aktarmaya çalışacağım.
Güvenlik önemli bir unsur, web uygulamalarımızda her zaman karşı kaşıya kaldığımız bir konudur. Güvenlik açıklarından biri SQL Injection, yani SQL aşılamadır.
SQL Injection’ı, veritabanından veri çekmek için kullandığımız SQL sorgularının istemediğimiz biçimde değiştirilmesi olarak özetleyebiliriz.
Bir örnek ile olaya daha yakından bakalım :
kullanıcı adında ,id -kullanici ve sifre alanlarının oluşan bir tablomuz var. Bu tabloyu üyelik sistemi için kullanıyoruz,kullanıcıya dair bilgileri bu tabloda saklıyoruz. Böylece sisteme girişleri (login) bu tablodaki bilgiler aracılığı ile gerçekleştiriyoruz. Buraya kadar herşey normal, şimdi basit bir şekilde bir sorgu yaparak, giriş yapmak isteyen kullanıcımzının bilgilerini kontrol edelim
1 2 3 4 5 6 | $baglanti=mysql_connect('localhost','kullanici_adi','sifre'); mysql_select_db('testdb'); $sorgu='select*from user where name="'.$_GET['u'].'" and password="'.$_GET['p'].'"'; $sonuc=mysql_query($sorgu); echo ' ',print_r(mysql_fetch_assoc($sonuc),true); |
Test etmesi kolay olsun diye, sadece GET ile gelen verilere göre işlem yapıyoruz. Bu sorgudan veri dönerse kullanıcımız var demektir, böylece kullanıcımızı giriş yapmış olarak kabul edebiliriz. Tabiki yukarıdaki gibi bir yöntem hiçbir yerde kullanılamaz, ama konuya verilebilecek iyi bir örnek.
Bu dosyayı kendi sunucumuzun diznine yerleştirip şu şekilde çalıştırdığımızda :
Bu dosyayı kendi sunucumuzun diznine yerleştirip şu şekilde çalıştırdığımızda :
Örn : http://localhost/test.php?u=ersin&p=12345
sorgumuz çalışacak, şartları sağlayan veri varsa ekrana yazdırılacak. Şimdi gelin biraz kötü niyetli davranalım, çünkü,bu kodu yazan hiçbir güvenlik önlemi almamış, cezalandırılmayı hak etmiş
Adres satırından şöyle bir giriş yaparsak :
http://localhost/test.php?u=” or 1=1–&p=” or 1=1–
karşımıza ilk kullanıcının verisi gelir. İşte bu SQL aşılamanın en bilinen örneği. Tabi bundan korunmanın tek yolu PDO değil ama gerçekten en akılcı ve etkin yöntemlerden biridir. Yukarıdaki satır, nasıl sonuç döndürülmesine sebep oldu derseniz, kullanıcıdan gelen veriyi filtrelemediğimiz için, kötü niyetli kullanıcı SQLi değiştirerek ( sorgu şu biçimde olur select*from user where name=”" or 1=1–” and password=”" or 1=1–”) , önemli bilgilere erişme olanağı bulmuştur.
Şimdi PDO ile bunun nasıl engellenebileceğine bakalım :
1 2 3 4 5 6 7 | $p=new Pdo('mysql:dbname=testdb;host=127.0.0.1','kullanici','sifre'); $st=$p->prepare('select*from user where name=? and password=?'); $st->execute(array($_GET['u'],$_GET['p'])); echo ' ',print_r($st->fetchAll(),true); |
Gördüğünüz gibi PDO ile hem daha anlaşılır, hem de daha kolay bir biçimde güvenli bir sorgulama yapabiliyoruz. Burada dikkat etmeniz gereken , PDO bizim yerimize verileri yerleştirirken (? işareti yerine bizim verdiğimiz veriler atanır), verdiğimiz parametrelerin sırasına göre yerleştirir .
Farklı yöntemlerde var ama şimdilik bu yazının konusu değil, sonrasında değinmeye çalışacağım.
PDO bu işlemi yaparken, kullanıcılar tarafından girilen verileri otomatik olarak etkisizleştirir. Böylece bizlere daha az yük düşer.
Farklı yöntemlerde var ama şimdilik bu yazının konusu değil, sonrasında değinmeye çalışacağım.
PDO bu işlemi yaparken, kullanıcılar tarafından girilen verileri otomatik olarak etkisizleştirir. Böylece bizlere daha az yük düşer.
Hiç yorum yok:
Yorum Gönder