Aslında birinde iki soru var. Başlıktan gelen sorunun, OP'nin daha sonra yorumlarda ifade ettiği endişelerle çok az ilgisi var.
Google'dan gelen okuyucular için önemli olanın OP için özel durum olduğunu fark etsem de, daha genel bir soruya cevap vermenin önemli olduğunu, "emin yaptıysam hazırlanmış ifadeler kadar güvenli birleştirme" şeklinde ifade edilebilir. birleştirdiğim her kelimenin tam anlamıyla güvenli olduğunu? " Bu nedenle, bu ikincisine konsantre olmak istiyorum. Ve cevap
Kesinlikle hayır.
Açıklama çoğu okuyucunun istediği kadar doğrudan değil, ama elimden gelenin en iyisini yapacağım.
Bir süredir konu üzerine kafa yoruyordum ve sonuçta her şeyi özetlemeye çalıştığım makale (PHP ortamına dayanıyor olsa da) ortaya çıktı. SQL enjeksiyonundan korunma sorununun genellikle dizgi kaçışı, tür atama ve benzeri gibi bazı ilgili ancak daha dar konulara doğru kaçtığı aklıma geldi. Bazı önlemler kendi başlarına alındığında güvenli kabul edilebilecekse de, hiçbir sistem veya izlenecek basit bir kural yoktur. Bu da zemini çok kaygan hale getiriyor, geliştiricinin dikkatini ve deneyimini çok fazla yüklüyor.
SQL enjeksiyonu sorunu belirli bir sözdizimi sorununa göre basitleştirilemez. Ortalama bir geliştiricinin düşündüğünden daha geniştir. Bu aynı zamanda metodolojik bir soru. Bu sadece "hangi biçimlendirmeyi uygulamamız gerektiği" değil, aynı zamanda " nasıl yapılmalı" dır .
(Bu bakış açısına göre, Jon Skeet'in diğer yanıtta atıfta bulunduğu bir makale iyiden çok kötü gidiyor, çünkü yine bazı uç durumlara odaklanıyor, belirli bir sözdizimi sorununa yoğunlaşıyor ve sorunu bütünüyle ele alamıyor.)
Koruma sorununu bir bütün olarak değil, bir dizi farklı sözdizimi sorunu olarak ele almaya çalıştığınızda, çok sayıda sorunla karşı karşıya kalırsınız.
- olası biçimlendirme seçenekleri listesi gerçekten çok büyük. Birinin bazılarını kolayca gözden kaçırabileceği anlamına gelir. Veya onları karıştırın ( örneğin , tanımlayıcı için dize kaçışını kullanarak ).
- Birleştirme, tüm koruma önlemlerinin program tarafından değil programcı tarafından yapılması gerektiği anlamına gelir. Bu sorun tek başına birkaç sonuca yol açar:
- böyle bir biçimlendirme manueldir. Manuel, son derece hataya açık demektir . Kişi başvurmayı unutabilir.
- dahası, biçimlendirme prosedürlerini merkezileştirilmiş bir işleve taşımak, işleri daha da karıştırmak ve veritabanına gitmeyen verileri bozmak için bir cazibe vardır.
- birden fazla geliştirici söz konusu olduğunda, sorunlar on katına çıkar.
- birleştirme kullanıldığında, potansiyel olarak tehlikeli bir sorguya bir bakışta söylenemez: hepsi potansiyel olarak tehlikeli!
Bu karışıklığın aksine, hazırlanmış ifadeler gerçekten Kutsal Kase'dir:
- takip edilmesi kolay basit bir kural şeklinde ifade edilebilir.
- esasen ulaşılamaz bir önlemdir, yani geliştiricinin müdahale edemeyeceği ve isteyerek veya istemeyerek süreci bozamayacağı anlamına gelir.
- Enjeksiyondan korunma, gerçekte hazırlanmış ifadelerin yalnızca bir yan etkisidir ve gerçek amaç sözdizimsel olarak doğru ifadeler üretmektir. Ve sözdizimsel olarak doğru bir ifade% 100 enjeksiyon kanıtıdır. Yine de herhangi bir enjeksiyon olasılığına rağmen sözdizimimizin doğru olmasına ihtiyacımız var.
- her yerde kullanılırsa, geliştiricinin deneyimine bakılmaksızın uygulamayı korur. Diyelim ki, ikinci dereceden enjeksiyon denen bir şey var . Ve "korumak için, Kullanıcı Tarafından Sağlanan Tüm Girişlerden Kaçın" yazan çok güçlü bir yanılsama . Bir araya geldiklerinde, bir geliştirici karar verme özgürlüğüne sahipse, neyin korunması gerektiğine ve neyin korunmayacağına karar verirse, enjeksiyona yol açar.
(Daha fazla düşündüğümde, mevcut yer tutucu setinin gerçek yaşam ihtiyaçları için yeterli olmadığını ve hem diziler gibi karmaşık veri yapıları hem de bazen eklenmesi gereken SQL anahtar sözcükleri veya tanımlayıcıları için genişletilmesi gerektiğini keşfettim. dinamik olarak da sorgu, ancak bir geliştirici böyle bir durum için silahsız bırakılır ve dize birleştirme işlemine geri dönmek zorunda kalır, ancak bu başka bir sorudur).
İlginç bir şekilde, bu sorunun tartışması, Stack Overflow'un çok tartışmalı doğası tarafından tetikleniyor. Sitenin amacı, aramadan gelen kullanıcılar için uygun genel amaçlı cevaplardan oluşan bir veri tabanına sahip olma hedefine ulaşmak için doğrudan soran kullanıcıların belirli sorularını kullanmaktır . Fikir kendi başına kötü değildir , ancak böyle bir durumda başarısız olur: bir kullanıcı çok dar bir soru sorduğunda , özellikle bir meslektaşıyla bir anlaşmazlıkta bir argüman elde etmek (veya kodu yeniden düzenlemeye değip değmeyeceğine karar vermek). Deneyimli katılımcıların çoğu , misyonu akılda tutarak bir cevap yazmaya çalışırken Yığın Taşması'nın bir bütün olarak ele alınması, yanıtlarının yalnızca OP için değil, mümkün olduğunca çok okuyucu için iyi olmasını sağlar.