SQL enjeksiyonu çok ciddi bir güvenlik sorunudur, çünkü büyük ölçüde yanlış anlamak çok kolaydır: Kullanıcı girişi içeren bir sorgu oluşturmanın bariz ve sezgisel yolu sizi savunmasız bırakır ve bunu azaltmanın Doğru Yolu parametreleştirilmiş olarak bilmenizi gerektirir önce sorgular ve SQL enjeksiyonu.
Bana göre bunu düzeltmenin açık yolu bariz (ama yanlış) seçeneğini kapatmak olacaktır: veritabanı motorunu düzeltin, böylece parametrelerin yerine WHERE yan tümcesinde kodlanmış değerleri kullanan herhangi bir sorgu alınca güzel, açıklayıcı bir sonuç döndürür parametreleri yerine kullanmanızı bildiren hata mesajı. Bunun açık bir şekilde bir seçenek dışı bırakılması gerekir; böylece yönetimsel araçlardan gelen geçici sorgular gibi şeyler hala kolayca çalışır, ancak varsayılan olarak etkinleştirilmesi gerekir.
Bunu yapmak, SQL enjeksiyonunu neredeyse bir gece boyunca soğuyacaktı ama bildiğim kadarıyla hiçbir RDBMS bunu yapmıyor. Olmamasının iyi bir nedeni var mı?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
gerçekten hazır olup olmadığını veya dizge birleştirme işleminden kaynaklandığını söyleyemez . Gördüğüm iki çözüm, SQL'den ve dize gömülü diğer DSL'lerden kurtulmak (lütfen evet) veya dize birleştirmenin parametreli hale getirilmiş sorguları kullanmaktan daha sinir bozucu olduğu dilleri teşvik etmek (umm, hayır).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
tek bir sorguda hem kodlanmış hem de parametreleştirilmiş değerlere sahip olurdu - onu yakalamaya çalışın! Bu tür karışık sorgular için geçerli kullanım durumları olduğunu düşünüyorum.