Tablolara katılırken, Zend Framework'ün SQL modellerini kullanıyorum. Örnek olarak, gerçek kodumu değiştirdim, ama bence puan alacaksınız:
$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');
Sayfa ajax ile yüklenir ve $ section parametresi GET parametresi ( www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
) olarak gönderilir .
Birisi böyle bir şey yaparsa sorun şu:
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)
Bu şekilde kullanıcı tüm veritabanını dökebilir. Veriler görüntülenmez, ancak SQL sql aşırı yüklenmesine neden olabilecek bir döküm gerçekleştirir.
Sorular:
- Bu senaryoyu önlemenin en iyi yolu nedir?
- Şimdi önceki müşteriler için endişeliyim. Bu kodla, tabloyu değiştirme veya değiştirme gibi daha fazla riskli işlem yapmak mümkün müdür? Sanırım DELETE sql sözdizimi hatası üretmek için alt seçim içinde SELECT dışında başka bir ifade koyamazsınız değil. Haklı mıyım?
GÜNCELLEME: Benim örneğim SQL enjeksiyonunun doğru bir örneği değil çünkü $ bölümleri etrafında işaret var ve bu nedenle enjeksiyon yapmak mümkün olmayacak. Her neyse, tamsayı değeri beklenirken ve tamsayı girişine filtre uygulamadığınızda bu mümkün olabilir. Aşağıdaki yorumuma bakın.
'
işaretten önce (
işaret olacaktır ve bu nedenle (SELECT
ya da herhangi bir şey işlev değil, dize gibi olacaktır. Alan tamsayı olduğunda, '
gerekli değildir ve bu tür bir senaryoyu mümkün kılar. Ancak tamsayı her zaman filtrelenmelidir, intval()
böylece bu da sorun değildir.
'
? Yani ' AND (SELECT ...) '
? Bu arada, Zend'in bunu alıntılamadığını sanmıyorum ... Ve eğer bağlamaları kullanırsanız, PDO bunu halledecektir. Asla böyle acı birleştirme kullanmayın:"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
ve$db->quote()
hatta senin durumunda bak$db->quoteInto
. Eğer$this
bir kaynaktır, bunu yapabilirsiniz:$this->getConnection('core_read')->quoteInto()
Bir koleksiyon eğer yapabilirdi:$this->getResource()->getConnection('core_read')->quoteInto()
. bu çizgiler boyunca. Bu sizi hedefinize doğru yönlendirirse.