Bu dokümanımızda günümüz de hala aktif bir şekilde web site saldırı alanlarında rol almakta olan SQL Injection (Sql Aşılama) ataklarının php de hangi sebeplerden kaynaklandığını ve bu açıkların temel sebeplerinin nasıl kapatılacağı ile ilgili bilgiler yer alacaktır.
SQL Injection web uygulamalarında ki en ciddi açıkların başında gelir. Özellikle frameworkler ve ORM (Object Relational Mapping) gibi ekstra veritabanı katmanlarının popülerleşmesi ile eskisine göre bugünlerde biraz daha az görülmektedir ama emin olun hala heryerdeler!
Öncelikle asıl odak noktamız olan SQL’i yakından tanıyalım
SQL Nedir?
SQL (Structured Query Language) veritabanlarında data çekme, silme ve değiştirme gibi işlemler için kullanılan basit yapılı bir dildir. Bugün hemen hemen tüm web uygulamalarının altyapısında veritabanı desteği vardır ve bu web uygulamaları veritabanı ile SQL aracılığıyla anlaşırlar.
Basit bir SQL nedir sorusu ile SQL i tanımış olduk.
SQL Injection ile neler yapılacağı bu sorumuz ile birlikte bir nebze de olsa cevaplanmış oldu bu cevaplar ile yola çıkacak olursak günümüzde aktif halde eskiye nazaran çok fazla bulunmasada hala SQL açıkları önemli bir açık olarak günümüz saldırılarında rol almaktadır.
Gelin SQL Injection Açığının PHP de oluşmasında önemli rol oynayan kodlara bakalım
$id $_GET[ficT];
$kayit mysql_query(“SELECT FROM ürünler WHERE id $id”)
Yukarıda bulunan kod satırını yorumlayacak olursak get ile bir önceki sayfadan çektiğimiz id değerini sorgulatmadan kayıt ürünler tablosuna yönlendirdik burda bulunan kod satırına müdahalemiz söz konusu aşağıdaki örnekte olduğu gibi;
+] www.free.com/urunler.php?id=2
web sitemizin get ile döndürdüğü id değeri :
ürünler tablosundan get ile gelen değer üzerinden php de kontrol yapılmadan sql veritabanına gönderilmektedir başlıca saldırı tipleri bunlardır.
Bunlara önlem alabilmek için bir çok yöntem bulunmakta saldırıların gerçekleştiği kod satırına göz attığımızda sorgu yapılmadan sql ile bağlantı kurulduğundan temel olarak gelen id değerini bir sorguya dahil ettikten sonra sql ile bağlantı sağlamamız bu konuda bazı önlemler alınabilmekte sorgu yapabileceğimiz fonksiyon;
$id= mysql_real_escape_string($id);
Bu fonksiyon ile gelen id değerini bir filtreden geçirerek id değerini sorguluyoruz.
Hata karakterlerinin filtrelemesini yapmaktadır ancak bu fonksiyon sql ınjection ataklarını yeterince engelleyememektedir id değerinin integer değerli baz alarak bu fonksiyonu kullanabiliriz.
is_numeric()
Kullanım örneği ;
$id 5;
if(is_numeric($id)){
echo ’Bu bir sayıdır’;
}
else {
echo ’Bu bir sayı değildir.';
>
Bu fonksiyonu tekil bir şekilde çalıştırdığımızda 5 değerinin yanına hata karakterleri uyguladığımızda else cevabını döndürecektir.