Neden ortak kaçış işlevlerini kullanarak daha güvenli bir mysql hazırlanmış deyimi kullanıyor?

6 Cevap php

Aşağıdaki diyor başka bir soru bir açıklama var:

"When it comes to database queries, always try and use prepared parameterised queries. The mysqli and PDO libraries support this. This is infinitely safer than using escaping functions such as mysql_real_escape_string."

Source

Peki, ben sormak istiyorum: Neden daha güvenli parametreli sorgular hazırlanır?

6 Cevap

Ben burada insanlar eksik olduğunu düşünüyorum önemli bir nokta parametreli sorgular destekleyen bir veritabanı ile, hiç endişelenecek 'kaçan' olmasıdır. Veritabanı altyapısı SQL deyimi içine bağlı değişkenleri birleştirmek ve daha sonra her şeyi ayrıştırmak değildir; Bağlı değişkenler ayrı tutulur ve genel bir SQL deyimi olarak çözümlenir asla.

Güvenlik ve hız geliyor orası. Veritabanı motoru tutucu yalnızca veri içeren bilir, bu yüzden tam bir SQL ifadesi olarak ayrıştırılır asla. Speedup kez bir bildiri hazırlamak ve daha sonra birçok kez çalıştırdığınızda gelir; kurallı örnek aynı tabloya birden fazla kayıt ekleme ediliyor. Bu durumda, veritabanı motoru sadece bir kez, vb optimize ayrıştırmak gerekiyor.

Şimdi, bir yakaladım veritabanı soyutlama kütüphaneleri ile. Onlar bazen sadece doğru kaçması ile SQL deyimi içine bağlı değişkenleri ekleyerek bu sahte. Yine de, o kendiniz yaparak daha iyidir.

İlk olarak, size, insan çok daha güvenlidir veritabanına tehlikeli karakterlerin kaçışa terk ediyoruz.

... Kaçmak için unutmak, ya da bazı kötü niyetli SQL enjekte etmek için kullanılan olabilir herhangi bir özel karakter kaçırmayın olacaktır. Söz değil, muhtemelen önyükleme için bir performans artışı alabilir!

Ben son derece güvenlik tecrübeli değilim ama burada ben size yardımcı olacağını umuyoruz bir açıklaması var:

Diyelim ki böyle bir açıklama var diyelim:

MyDB [tamsayı] seçiniz

Bunu hazırlamak zaman iddia, deyim bizim hayali sql uygulanmasında bayt aşağı derlendi.

           01                  00 00                  23
Opcode for select          Prepared bytes      number of "mydb"
                          for your integer

Şimdi çalıştırdığınızda, size hazırlanmış deyimi için ayrılmış alana numarasını ekler.

Sadece kaçış kullanırsanız, muhtemelen orada çok anlamsız eklemek ve belki hafıza taşmasına neden, ya da kaçmak için unuttum bazı bizzare sql komutuna olabilir karşılaştırın.

Hazırlanıp, size içeriğini kaçmak için unutamam çünkü. Yani güvensizlik tanıtmak için hiçbir yolu yoktur.

Eğer mysql_query aramak her zaman mysql_real_escape_string kullanmayı unutmayın IF mysql_real_escape_string hazırlanmış tablolara kadar güvenli olduğunu, ancak unutmak kolaydır.

Fonksiyon bu nedenle güvenli değildir istismar http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string. Hazırlanan tablolar tercih nedeni budur ve de performans artışı sağlar.

Çok iyi durumda, o olmayabilir, ama en azından aynı derecede güvenli; ve neden şans mı?