Aradığınız koruma seviyesi ile sağlanır backticks:
"SELECT * FROM `$db` WHERE 1";
Backticks için kullanılan qualify identifiers aksi takdirde belirsiz olabilir (yani MySQL reserved words) ve kullanıcı girişi kabul eden veya değişken-adlandırılmış sütunları veya veritabanları var ise, kesinlikle backticks kullanmalısınız, ya da ben size ileride sorun haline çalıştırırsanız söz verebilirim. Örneğin, ne geçici bir alan adı bazı kullanıcı girişi ile oluşturulmuş bir sistem olsaydı, sadece sona erdi adlı varlık update
? Alanını çıktı
"SELECT field1,field2,update FROM table;"
Bu sefil başarısız olur. Ancak;
"SELECT `field`,`field2`,`update` FROM table"
gayet güzel çalışıyor. (Bu aslında bu sorunu vardı ben bir kaç yıl önce üzerinde çalıştığı bir sistemden gerçek bir örnektir).
Bu kötü SQL koyarak açısından sorunu çözer. Örneğin, aşağıdaki sorgu sadece bir "bilinmeyen sütun" hata dönmek, nerede test; DROP TABLE test
enjekte saldırı kodu:
"SELECT * FROM `test; DROP TABLE test`;"
Be careful though: SQL Injection is still possible with backticks!
Örneğin, $db
değişken had a backtick in it, hala normal bir şekilde bazı SQL enjekte edebilir bu verileri içeriyorsa. Veritabanı ve alan adları için değişken verileri kullanarak yapıyorsanız, sizin deyimi içine koyarak, ve sonra bir kez içinde ters tırnakların ile eleme önce tüm ters tırnakların soymak gerekir.
$db = str_replace('`','',$db);
$sql = "SELECT * FROM `$db` WHERE 1";
Ben veri sanitasyon ve veritabanı tanımlayıcılarını hijyen için ayrı işlevlere sahip bir veritabanı sarıcı kullanmak, ve bu son yaptığı budur :)