* Ne zaman değil * hazır deyimleri kullanılır?

6 Cevap php

Ben en az bir veritabanı kullanan bir PHP tabanlı web sitesi yeniden mühendislik ediyorum. Orijinal versiyonu enjeksiyon saldırıları önlemek ve sayfa mantık veritabanı mantığı ayırmak için "sahte hazırlanmış-ifadeleri" (PHP fonksiyonları alıntı yaptı ve parametre değiştirme) kullanılır.

Bu PDO ve gerçek hazırlanmış deyimleri kullanan bir nesne ile bu ad-hoc işlevlerini yerine doğal görünüyordu, ama onlara benim okuma yaptıktan sonra, ben o kadar emin değilim. PDO yine harika bir fikir gibi görünüyor, ancak hazırlanan tabloların birincil satış noktalarından biri ben asla hangi ... onları yeniden mümkün ediliyor. İşte benim Kurulum:

  • Tablolar, bütün trivially basittir. En şeklinde olan SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1. Çok en karmaşık deyim böyle üç seçer UNION ALL s ile birlikte katıldı basitçe.
  • Her sayfa yürütür at most bir deyim vurdu ve sadece bir kez çalıştırır.
  • Ben barındırılan bir ortamda yaşıyorum ve şahsen herhangi bir "stres testleri" yaparak kendi sunucularını çarparak nedenle temkinli.

Hazırlanmış deyimleri kullanarak, en azından ben yapıyorum veritabanı sayısını turu gezileri katına çıkacağını göz önüne alındığında, ben onları kaçınarak daha iyi miyim? Ben parametreleriyle ve enjeksiyon savunma yararı koruyarak PDO::MYSQL_ATTR_DIRECT_QUERY birden fazla veritabanı gezileri yükü önlemek için kullanabilir miyim? Veya hazır deyimi API tarafından kullanılan ikili görüşmeleri bu konuda endişe etmemesi gerektiğini olmayan hazırlanmış sorguları yürütme kıyasla yeterince iyi yapabilirim?

EDIT:

Tüm iyi tavsiye, millet için teşekkürler. Farklı bakış açıları çok - bu "kabul" gibi birden fazla cevabı işaretleyiniz isterdim biridir. Sonuçta da, ben vermek zorunda rick onun yüzünden ... onun cevabını vermeden ben blissfully kapalı gitmiş olurdu ve hatta following herkesin tavsiyesine sonra tamamen yanlış Şey yapılır. :-)

Emulated öyle tablolarını!

6 Cevap

Ben PDO :: ATTR_EMULATE_PREPARES istiyorum düşünüyorum. Yani yerli veritabanı tablolarını hazırlamıştır kapatır, ama yine de sorgu bağlamaları SQL enjeksiyonu önlemek ve düzenli sql saklamanızı sağlar. Kimden ne anlıyorum, PDO :: MYSQL_ATTR_DIRECT_QUERY tamamen sorgu bağlamaları kapanır.

Senin için her şeyi yapacağım değilse Today's rule of software engineering:, bunu kullanmıyorum.

Ne zaman not hazırlanmış deyimleri kullanılır? Sadece db bağlantısı kaybolduktan önce bir kez deyimi çalışan olacak olduğunuzda.

Ne zaman not (çoğu kişi için hazırlanmış deyimleri kullanmak gerçekten ne) bağlı sorgu parametreleri kullanmak için? Ben "asla" demek için eğimli ve ben gerçekten "asla" demek isterdim, ama gerçekte en veritabanları ve bazı db soyutlama katmanları onlar parametreleri bağlamak için izin vermeyecektir altında belirli şartlara sahip olduğunu, bu yüzden 'Bu durumlarda bunları kullanmayın zorunda re. Başka zaman olsa da, bu sizin hayat daha basit ve bunları kullanmak için kod daha güvenli hale getirecek.

Ben PDO ile aşina değilim, ama ben ayrı bir adım olarak çalıştırmak, sonra hazırlamak istemiyorsanız eğer aynı işlevi çağrısı verilen değerlerle parametrized sorguları çalıştırmak için bir mekanizma sağlar bahse girerim. (Örneğin, gibi bir şey run_query("SELECT * FROM users WHERE id = ?", 1) veya benzeri.)

Eğer kaputun altında bakarsanız sadece statik bir SQL deyimini yürütmek için bunu söylemek bile Ayrıca, en db soyutlama katmanları, çalıştırmak sonra, sorgu hazırlayacaktır. Yani muhtemelen açık olsa hazırlar kaçınarak db bir gezi tasarruf değil.

Aşağıdaki gibi hazırlanan tabloların faydaları şunlardır:

  • Her sorgu sadece bir kez derlendi
  • mysql sunucuya veri göndermek için daha verimli bir ulaşım biçimini kullanır

Ancak, hazırlanan tablolar, sadece bağlantı başına devam etmektedir. Bağlantı havuzu kullandığınız sürece sadece sayfa başına bir bildirimde yapıyoruz, hiçbir yararı olmazdı. Trivially basit sorgular, ya daha etkili taşıma biçimi yarar olmaz.

Şahsen ben rahatsız olmaz. Pseudo-Hazırlanan tabloları muhtemelen sağlamak alıntı güvenli değişken için yararlı olması muhtemeldir.

Hazırlanan tablolar binlerce kişi tarafından kullanılmakta olan ve bu nedenle de test edilir (ve dolayısıyla bir de makul bir şekilde güvenli çıkarabiliriz). Sizin özel çözüm, yalnızca sizin tarafınızdan kullanılır.

Özel çözüm güvensiz olduğunu şansı oldukça yüksektir. Hazırlanan ifadeler kullanın. Daha az kod bu şekilde sürdürmek zorunda.

Dürüst olmak gerekirse, ben bunu dert gerektiğini sanmıyorum. Ancak, desteklenen PHP veri erişim çerçeveler bir numarası beyanı modları ve non-hazırlamak ilkesi modları hazırlamak unutmayın. Eğer yanlış hatırlamıyorsam, ARMUT: DB geri gün yaptım.

Ben senin gibi aynı sorunu koştum ve benim kendi rezervasyonları vardı, bu yüzden yerine PDO kullanarak ben hazırlar ve standart ifadeleri desteklenen ve hem de doğru kaçışa (sql-injection önleme) gerçekleştirilen benim kendi hafif veritabanı katmanı yazma sona erdi olgu. Hazırlar ile benim diğer sancı biri bazen ... gibi bir beyanı olmayan bazı escapable girişi eklemek için WHERE id IN (1, 2, 3 ...). Daha verimli olduğunu

Ben bunu kullanarak diğer seçeneklerin ne olduğunu anlatmak için PDO hakkında yeterli bilmiyorum. Ancak, PHP desteklediği tüm veritabanı sunucuları için kullanılabilir fonksiyonları kaçan ve sizinle sıkışmış herhangi bir veri erişim katmanı üstüne kendi küçük katman rulo olabilir biliyorum.