2010-06-23 16 views
6

Şu anda mysqli php uzantısını kullanıyorum. mysqli hazırlanmış ifadeler ve mysqli_real_escape_string

Geleneksel ben kullanıcı girişi kaçmak için mysqli_real_escape_string kullandık. Ancak, hazırlanan ifadeleri kullanmak için kod üzerinde (umarım mümkün olduğu kadar az adımda) değişiklik yapmaya çalışıyorum.

Bu konuda açık olmak istiyorum - Ben değişkenlerin tümünü bağlamak için hazır deyimleri kullanmanız koşuluyla, Sql enjeksiyon imkansız olduğunu emin olabilirler? (Ve mysqli_real_escape_string yerini almaya başladı?)

Teşekkür

cevap

5

doğru tüm değişkenleri bağlamak Eğer dramatik SQL enjeksiyonu riskini azaltabilir. Örneğin dinamik SQL oluşturursanız bir SQL enjeksiyon elde etmek hala mümkün:

'SELECT * FROM ' . $tablename . ' WHERE id = ?' 

Ama bu gibi şeyler önlemek eğer sorunlar olacaktır olası değildir. Eğer doğru bağlamak veya değişkenleri biçimlendirmek eğer

+0

Evet, daha fazla bilgi için bkz http://www.sjmp.de/php/php-mysql-mehr-sicherheit-und-erhoehte-performance-durch-mysqli-und-prepared-statements/ – Tobias

4

güvenlik konuşan, her iki yöntem arasında fark yoktur. sadece her durumda kullanılabilir, çünkü

Bağlama kaçarken değil (bu yüzden, bunun yerine alıntı/kaçan bazı değişkenleri döküm zorunda) olabilir, sadece daha basittir. Ayrıca, hiçbir bağlayıcı veya kaçmanın tanımlayıcıyı güvenli hale getiremeyeceğini unutmayın. Dolayısıyla, sorgunuzda bir alan adı veya operatör kullanmanız gerekiyorsa, kodunuzda kodlanmış bir değer kullanmanız gerekir.

2

İşte konuyla ilgili üst düzey görünümüm. Dinamik SQL dizeleri kullanırken

, doğru çalışma kaçan fonksiyonu güveniyorlar. Veri değerleri kaçtı edildikten sonra

http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html

SQL dizesi ayrıştırılır ve veritabanı tarafından derlenen edilecek etti: Bu (kuşkusuz eski) örneğinde görülebileceği gibi Ne yazık ki bu durum, her zaman değil sunucusu. Eğer kaçan işlev düzgün şekilde işini yapmamışsa veya akıllı bir yeni SQL enjeksiyon saldırısı tespit edilmişse, sunucunun SQL ifadeleri için veriyi hata yapması ihtimali vardır.

Parametrelerle hazırlanmış ifadeler kullanırsanız, ifade ilk olarak ayrıştırılır ve derlenir. Veri değerleri, yürütüldüğünde derlenmiş ifade ile birleştirilir. Bu, SQL mantığını veri değerlerinden ayırır - iki 'u karıştırmama fırsatı asla oluşmaz.

Yani, evet, mysqli_real_escape_string no'lu yayına başvurabilirsin, ancak hazırladığı ifadeleri parametrelerle kullanmanın SQL Injection'ı imkansız hale getirdiğini söyleyecek kadar ileri gitmem. mysqli_real_escape_string hatasında olduğu gibi, bunu daha da zorlaştırır, sanırım her zaman keşfedilecek (veya yeni oluşturulan) bir hatanın mümkün olanı imkansız kılacağı ihtimali vardır.