O kadar basit değil. Yerine literal values sadece yerine SQL ifadeleri içine uygulama değişkenlerini interpolasyon bağlı parametreleri kullanabilirsiniz:
$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe
$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe
Ama ne bir değişmez değer yanında sorgu dinamiğin parçası yapmak gerekirse?
$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe
$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work!
Parametre her zaman bir değer değil, bir sütun tanımlayıcı olarak yorumlanır. Sen ORDER BY score
farklı, ve bir parametre kullanılarak eski olarak yorumlanır olacak olan ORDER BY 'score'
ile bir sorgu çalıştırabilirsiniz - bir sabit bir dize 'score'
, değil adlı sütunundaki değer score
.
Yani dinamik SQL kullanmak ve istediğiniz sonuçları almak için sorgu içine uygulama değişkenlerini sokmak zorunda vakaların çok sayıda bulunmaktadır. Bu gibi durumlarda, sorgu parametreleri size yardımcı olamaz. Hala SQL enjeksiyon kusurları önlemek için defans uyanık ve kod olmalı.
Hiçbir çerçeve veya veri erişim kütüphane sizin için bu işi yapabilirsiniz. Her zaman, bir SQL enjeksiyon kusur içeren bir SQL sorgu dizesi inşa edebilirsiniz ve veri erişim kitaplığı SQL sorgusu görmeden bunu. Peki nasıl kasıtlı bilmek gerekiyordu ve bir kusur ne olduğunu?
İşte güvenli SQL sorguları ulaşmak için yöntemler şunlardır:
Filter input. SQL sorguları takılı alır herhangi bir değişken veri Trace. Girişini kullanın filters yasadışı karakterler şerit. Örneğin, bir tamsayı düşünüyorsanız, giriş tamsayı olması için kısıtlı olduğundan emin olun.
Bu bağlamda Escape output. Çıkışı veritabanı sunucusuna göndermek SQL sorgu olabilir. Eğer değerler için SQL sorgu parametreleri kullanabilirsiniz biliyorum, ama ne bir sütun adı hakkında? Sen, tanımlayıcılar için bir alıntı / kaçan işlevini gereken sadece eski gibi mysql_real_escape_string()
dize değerleri içindir.
Code reviews. Birisi gözleri ikinci bir çift olmak için alın ve size yukarıdaki iki tekniklerini kullanmayı ihmal yerlere nokta yardımcı olmak için, SQL kod üzerinden gitmek.