Parametreli sorgular, değerleri sorguya özel parametreler aracılığıyla geçirme imkanı sağlar, bu sayede değişkenlerin doğrudan yerine konması yerine, güvenliği artırır ve SQL enjeksiyonlarına karşı koruma sağlar. Ayrıca, tekrar eden sorguların planlarının önbelleğe alınması sayesinde yürütme süresini hızlandırır.
Dinamik SQL, sorguları anlık olarak oluşturma ve yürütme imkanı tanır (örneğin, MS SQL'de EXEC sp_executesql veya PostgreSQL'de PREPARE/EXECUTE aracılığıyla). Çok dikkatli olunması gerekir: değerin doğrudan sorgu metnine yerleştirilmesi SQL enjeksiyonlarına, sözdizimi hatalarına ve kötü performansa yol açabilir.
Python ve psycopg2 kütüphanesi ile parametrik sorgu örneği:
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
PostgreSQL'de dinamik SQL örneği:
EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);
Soru: Neden bazı eski uygulamaların yaptığı gibi sadece tırnakları ('') kaçırmak, SQL enjeksiyonlarına karşı korumak için yeterli değildir?
Cevap:
Tırnakları kaçırmak, özellikle saldırgan SQL sorgusu yapısını yerleştirirse (örneğin, "; DROP TABLE users;") tüm türdeki enjeksiyonlardan korumaz. Ayrıca, bu her veri türünün farklı özelliklerini kapsamaz ve kodlama veya özel karakterler aracılığıyla filtrelerin atlanmasına karşı koruma sağlamaz. Her zaman parametreli sorgular kullanılmalıdır.
Hikaye
Hikaye
Hikaye
CRM uygulamasında "O'Connor" harfi, SQL sorgularını basit dize birleştirme ile oluşturan uygulamada bir hataya neden oldu. Kaçırılan tekil tırnak yüzünden bu soyadıyla hiçbir kayıt kaydedilemedi ve bu durum sadece bir yıl sonra fark edildi.