SQL Injection, web formlarında kullanılan metin kutularından ya da URL ile gönderilen değişkenler üzerinden SQL sorgu cümleciğine direkt olarak müdahale edilmesi ile gerçekleştirilen bir ‘deface’ yöntemidir. Bu yöntem lamer olarak adlandırılan kötü niyetli insanlar tarafından kullanılır.
Gerçek hayatta olduğu gibi, Internet ortamında da dünyaya karınağrısı yaratmak için gelmiş olan, ego tatmini ve adrenalinle beslenen bünyeler mevcuttur. Bu ezik insanlardan sitelerinizi korumanın yolu aslında çok basittir.
Önce bu sorunun nasıl oluştuğunu örnek üzerinde inceleyelim;
/* Gelen POST verilerine göre veritabanından belirtilen
kullanıcı adı ve parolaya sahip olan kullanıcı isteniyor */
$sorgu = “SELECT * FROM kullanicilar WHERE kullanici=’{$_POST[’kullanici’]}’ AND parola=’{$_POST[’parola’]}’”;
mysql_query($sorgu);
/* Yukarida $_POST[’parola’]'yı kontrol etmeyi ‘unuttuk’.
Bunu kodu inceleyerek ya da deneme yoluyla öğrenen bir lamer
Aşağıdakine benzer bir giriş yapacaktır. */
$_POST[’kullanici’] = ‘EAN’;
$_POST[’parola’] = “‘ OR ”=’”;
Burada yürüyecek sorgu şu olacaktır;
SELECT * FROM kullanicilar WHERE kullanici=’EAN’ AND parola=” OR ” = ”
Bunu önlemenin çeşitli yolları var, buna karşı sunucuda alınabilecek önlem; php.ini’yi düzenlerken magic-quotes değerini “on” yapmaktır.
İkinci önlem sunucudaki magic-quotes değerini dikkate almadan PHP’nin sihirli işlevlerinden mysql_real_escape_string() işlevini kullanmaktır.
Şöyle;
$sorgu = sprintf(”SELECT * FROM kullanicilar WHERE kullanici=%s AND parola=%s”,
mysql_real_escape_string($_POST[’kullanici’]),
mysql_real_escape_string($_POST[’parola’]));
Üçüncü ve kesin önlem, temizleyici bir işlev yazmak ve tüm uygulamalarda işlev kütüphanemizden bu işlevi çağırarak çalışmaktır.
Şimdi bunu görelim;
function duzelt($deger)
{
// /’ yerine ‘ bırakıyoruz.
if (get_magic_quotes_gpc()) {
$deger = stripslashes($deger);
}
// sayısal değer değilse mysql_real_escape_string() işlevini uyguluyoruz
if (!is_numeric($deger)) {
$deger = “‘” . mysql_real_escape_string($deger) . “‘”;
}
return $deger;
}
$sorgu = sprintf(”SELECT * FROM kullanicilar WHERE kullanici=%s AND parola=%s”,
duzelt($_POST[’kullanici’]),
duzelt($_POST[’parola’]));
mysql_query($sorgu); // temiz bir sorgu
Evet hepsi bu!