Saat bergabung dengan tabel, saya menggunakan model SQL dari Zend Framework. Sebagai contoh saya memodifikasi kode saya yang sebenarnya, tetapi saya pikir Anda akan mengerti maksudnya:
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
Halaman dimuat dengan ajax dan parameter $ section dikirim sebagai parameter GET ( www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
).
Sekarang inilah masalahnya jika seseorang melakukan sesuatu seperti ini:
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
Dengan cara ini pengguna dapat membuang seluruh basis data. Data tidak akan ditampilkan, tetapi tetap SQL akan melakukan dump yang dapat menyebabkan kelebihan sql.
Pertanyaan:
- Apa cara terbaik untuk mencegah skenario seperti itu?
- Sekarang saya khawatir dengan pelanggan sebelumnya. Apakah dengan kode ini dimungkinkan untuk melakukan tindakan yang lebih berisiko, seperti menghapus atau mengubah tabel? Saya kira bukan karena Anda tidak dapat menempatkan pernyataan selain SELECT di dalam subselect sehingga DELETE akan menghasilkan kesalahan sintaksis sql. Apakah saya benar?
UPDATE: Contoh saya bukan ilustrasi yang tepat dari injeksi SQL karena ada 'tanda sekitar bagian $ dan dengan demikian tidak akan mungkin untuk membuat injeksi. Bagaimanapun ini akan mungkin terjadi ketika mengharapkan nilai integer dan ketika Anda tidak memfilter input integer. Lihat komentar saya di bawah.
'
tanda sebelum (
tanda dan dengan demikian (SELECT
atau apa pun akan sama seperti string dan bukan berfungsi. Ketika bidang bilangan bulat, maka '
tidak diperlukan dan itu memungkinkan skenario seperti itu. Tapi integer harus selalu difilter intval()
jadi ini juga bukan masalah.
'
? Jadi ' AND (SELECT ...) '
? Ngomong-ngomong, saya tidak berpikir Zend tidak mengutip ini ... Dan jika Anda menggunakan binding, maka PDO akan menangani ini. Hanya tidak pernah menggunakan rangkaian sengatan seperti ini:"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
dan$db->quote()
bahkan dalam kasus Anda lihat$db->quoteInto
. Jika$this
adalah sumber daya, Anda bisa melakukan:$this->getConnection('core_read')->quoteInto()
jika koleksi Anda bisa melakukan:$this->getResource()->getConnection('core_read')->quoteInto()
. sepanjang garis itu. Jika itu membantu membimbing Anda menuju tujuan Anda.