SQL Injection, kullanıcıdan alınan verilerin güvenli şekilde işlenmeden doğrudan SQL sorgularına eklenmesi sonucu oluşan ciddi bir web güvenliği açığıdır.
Örneğin bir giriş ekranında sorgu şu şekilde hazırlanıyorsa;
SELECT * FROM users WHERE username = '$username' AND password = '$password'
kullanıcıdan gelen veri doğrudan sorgunun içine girdiği için saldırgan SQL mantığını değiştirmeye çalışabilir. En bilinen örneklerden biri
' OR '1'='1 benzeri ifadelerdir.
Mantık basitçe şudur:
SELECT * FROM users WHERE username = '' OR '1'='1'
Buradaki
1=1 ifadesi her zaman doğru olduğu için, uygulamanın sorguyu nasıl oluşturduğuna bağlı olarak normal kontrol mekanizması bozulabilir.
Aynı problem ID ile veri çeken sayfalarda da görülebilir;
SELECT * FROM users WHERE id = '$id'
Eğer
$id değeri doğrudan kullanıcıdan alınıyorsa saldırgan sorgunun yapısına müdahale etmeye çalışabilir.
Buradaki temel sorun, kullanıcı girdisinin
veri olarak değil SQL kodunun bir parçası olarak değerlendirilmesidir. addslashes, karakter silme veya birkaç kelimeyi engellemek SQL Injection için güvenilir bir çözüm değildir.
PHP projelerinde bu açığı önlemenin doğru yolu
PDO veya
MySQLi ile
Prepared Statements kullanmaktır. Böylece kullanıcıdan gelen değer sorgunun yapısını değiştiremez ve yalnızca veri olarak işlenir.