SQL enjeksiyonu

“Web sitesi güvenliğini sağlama” makalesi Sophos Plc ve SophosLabs tarafından sağlanmaktadı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 düşünün:

$firstname = $_POST["firstname"]; mysql_query("SELECT * FROM users WHERE first_name='$firstname'");

Kullanıcı bir formda adını girdikten sonra, SQL sorgusu aynı ada sahip tüm kullanıcıların listesini döndürür. Birisi formda "Chris" girerse, SQL sorgusu şöyle görünecektir:

"SELECT * FROM users WHERE first_name='Chris'"

Bu, beklenildiği gibi çalışacak geçerli bir yapıdır. Ama örneğin, ad yerine "'; drop table; #" girerseniz ne olur? O zaman yapı şu şekilde görünecektir:

"SELECT * FROM users WHERE first_name=''; DROP TABLE users; #'"

Noktalı virgül, birden fazla ardışık komutun çalıştırılmasına izin verir. Basit bir SQL komutunun karmaşık bir üçlü yapıya dönüşmesi sonucu:

SELECT * FROM users WHERE first_name='';

İlk talimat artık işe yaramaz, atlanabilir. İkinci talimat, veritabanından tüm tabloyu silecektir. İlk satırdaki “#” karakteri, MySQL’in dizenin geri kalanını görmezden gelmesini sağlayacaktır.

Bu güvenlik açığı özellikle tehlikelidir çünkü kapalı verileri almak, bazı alanları değiştirmek veya bilgileri kaldırmak için kullanılabilir. Bazı DBMS’ler ayrıca SQL kullanarak sistem komutlarını çalıştırmanıza da izin verir.

Neyse ki, kullanıcı girdisini doğrulayarak bu tür tehditleri kolayca ortadan kaldırabilirsiniz. PHP, dizgeden potansiyel SQL enjeksiyon kodunu kaldıran özel bir mysql_real_escape_string işlevi sunar. SQL talimatına enjekte edilen tüm verileri filtrelemek için bunu kullanmalısınız.

Sonraki

Destek ile iletişime geçin




Ayrıca şuraya gidebilirsiniz: