PHP MySQLi güvenli bağlı parametreleri ile sorgu hazırlanır?

3 Cevap php

Tarihsel olarak, ben hep kullandım

mysql_real_escape_string()

veritabanını dokunmadan biter kullanıcıların elde edilen tüm giriş için.

Şimdi tamamen MySQLi üzerine çevirdik ve ben bağlı parametreleri ile hazırlanmış sorguları kullanıyorum, ben SQL enjeksiyon saldırıları olasılığını ortadan kaldırmıştır?

Ben artık gerek diyerek düzeltmek am

mysql_real_escape_string()?

This is my understanding and the basis of a project of mine: http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

Bu ben şimdi onu serbest ettik, hem de başkalarını etkileyebilecek olsa da yanlış almak istediğiniz bir şey değildir.

All user provided input will now end up in bind_parms.
The queries provided in the prepare phase are static.

3 Cevap

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.

Evet. Hazırlanan sorguyu kullanarak parametreleri kaçış olacaktır.

Eğer hazırlanmış deyimi için parametreleri bağlamak, otomatik veri kaçar, o yüzden aracılığıyla göndermeden önce bunu kaçmak gerekir. Çifte öncelemeli genellikle kötü bir şeydir. En azından, daha sonra ekstra kaçtı karakterleri ile çirkin sonuçlar üretir.