SQL enjeksiyonu
“Bir web sitesinin güvenliğini sağlama” makalesi Sophos Plc ve SophosLabs tarafından sunulmaktadır.
Aralık 2007.
SQL enjeksiyonu, veritabanlarıyla çalışan sitelere saldırmak için kullanılır [14]. SQL enjeksiyonu, SQL sorguları filtrelenmemiş kullanıcı girdisi kullandığında mümkün hale gelir.
SQL sorguları, veritabanından veri almak, veritabanına eklemek, ayrıca veritabanındaki verileri değiştirmek ve silmek için kullanılır. Birçok site, dinamik içerik sayfaları için betikler ve SQL kullanır. SQL sorguları genellikle kullanıcı tarafından girilen verileri kullanır. Bu, güvenlik risklerine neden olabilir çünkü bilgisayar korsanları, giriş verilerine kötü niyetli SQL kodu enjekte etmeye çalışabilir. Yeterli koruma önlemleri olmadan, bu tür kodlar sunucuda başarıyla çalıştırılabilir.
Not
Aşağıdaki PHP kodunu göz önünde bulundurun:
$firstname = $_POST["firstname"]; mysql_query("SELECT * FROM users WHERE first_name='$firstname'");
Kullanıcı bir forma adını girdikten sonra, SQL sorgusu aynı ada sahip tüm kullanıcıların listesini döndürür. Birisi forma “Chris” yazarsa, SQL sorgusu şöyle görünecektir:
"SELECT * FROM users WHERE first_name='Chris'"
Bu, beklendiği gibi çalışacak geçerli bir yapıdır. Ama örneğin, isim yerine “'; drop table; #” girerseniz ne olur? O zaman yapı şöyle görünür:
"SELECT * FROM users WHERE first_name=''; DROP TABLE users; #'"
Noktalı virgül, birkaç ardışık komutu yürütmenize olanak sağlar. Basit bir SQL komutunun sonucu olarak karmaşık bir üçlü yapıya dönüşür:
SELECT * FROM users WHERE first_name='';
İlk komut artık gereksiz, atlanabilir. İkinci komut tüm tabloyu veritabanından silecek. İlk satırdaki “#” karakteri MySQL’in dizenin geri kalanını yok saymasını sağlayacak.
Bu güvenlik açığı özellikle tehlikelidir, çünkü kapalı verileri geri almak, bazı alanları değiştirmek veya bilgileri silmek için kullanılabilir. Bazı DBMS’ler SQL kullanarak sistem komutlarını yürütmenize de izin verir.
Neyse ki, kullanıcı girdisini doğrulayarak bu tür tehditleri kolayca ortadan kaldırabilirsiniz. PHP, dizgeden olası SQL enjeksiyon kodunu kaldıran özel bir mysql_real_escape_string işlevine sahiptir. SQL komutuna eklenen tüm verileri süzmek için bunu kullanmalısınız.