PHP’de SQL Injeksiyon’u önlemek
Temmuz 10th, 2007
Web programlamada olası güvenlik açıkları genelde SQL Injeksiyon’dan geçiyor. Aslında bunu önlemek bir programcı olarak gayet kolay fakat çoğu web programcı sql injeksiyonun mantığının ne olduğunu bilmediği için korunma mantığıda geliştiremiyor. Önce sql injeksiyon nedir öğrenelim daha sonrada korunmak için neler yapılabilir görelim.
Nedir bu SQL Injeksiyon?
Eğer bir değişken sql çekerken sql kodunda geçiyorsa ve o değişken post veya get yolu ile alınıyorsa olası bir sql injeksiyon açığı vardır.
$degisken=$_POST[degisken];
$sql="DELETE FROM tablo where id='$degisken'";
Örneğin yukarıdaki kodda olası bir tehdit var. Olaya şöyle bakalım. $degisken’in içine şöyle birşey girilirse ne olur: 1′ OR ”=’. Olacak belli, bu komut tablo içindeki tüm kayıtları silecek. Hemen deniyelim, kod şu şekile geliyor: DELETE FROM tablo where id=’1′ OR ”=” ve eğer boş, boşa eşitse sil mantığı tüm satırlara uyacağı için tüm satırları siliyor. Buda demek oluyor ki, ‘ gibi karakterler değişken içinde kullanılabileceği için değişken sql satırına girmeden önce denetlenmeli.
Peki nasıl korunacağız?
1. YOL
function sqlkorunma($deger) {
$karakter=array("UNION",">","<","'","\"");
$kodla=array("UN1ON",">","<","'",""");
$deger=str_replace($karakter,$kodla,$deger);
return $deger;
}
Yukarıdaki fonksiyonu kodlar arasına ekledikten sonra sql içinde geçen ve post veya get ile gelen tüm değişkenleri:
$degisken=sqlkorunma($_POST[degisken]);
gibi bir mantıkla bu fonksiyondan geçireceğiz. Bu fonksiyon UNION, ‘, <, > ve ” karakterlerini html koda çeviricek bu sayede sql injeksiyona karşı site kale gibi olmuş olacak.
2. YOL
Yukardaki ile aynı mantıkta. Sadece gelen değişkenleri tek tek fonksiyondan geçirmek yerine tek bir döngü ile bu işi halledeceğiz. Fakat yüksek ziyaretçiye sahip sitelerin performansı bakımından değişkenleri tek tek geçirmelerini tavsiye ederim.
function sqlkorunma($deger) {
$karakter=array("UNION",">","<","'","\"");
$kodla=array("UN1ON",">","<","'",""");
$deger=str_replace($karakter,$kodla,$deger);
return $deger;
}foreach ($_POST as $degadi => $deger) {
$_POST[$degadi]=sqlkorunma($deger);
}
foreach ($_GET as $degadi => $deger) {
$_GET[$degadi]=sqlkorunma($deger);
}Hepsi bu kadar :)
Temmuz 21st, 2007 at 20:35
tşklerrr