Quando si uniscono le tabelle, utilizzo i modelli SQL di Zend Framework. Come esempio ho modificato il mio codice attuale, ma penso che otterrai il punto:
$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');
La pagina viene caricata con ajax e il parametro $ section viene inviato come parametro GET ( www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
).
Ora ecco il problema se qualcuno esegue qualcosa del genere:
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)
In questo modo l'utente può scaricare l'intero database. I dati non verranno visualizzati, ma comunque SQL eseguirà il dump che può causare un sovraccarico di SQL.
Domande:
- Qual è il modo migliore per prevenire tale scenario?
- Ora sono preoccupato per i clienti precedenti. Con questo codice è possibile rendere ancora più rischiose le azioni, come delare o modificare la tabella? Immagino di no perché non è possibile inserire altre istruzioni oltre a SELEZIONA all'interno della sottoselezione, quindi ELIMINA produrrebbe un errore di sintassi di SQL. Ho ragione?
AGGIORNAMENTO: Il mio esempio non è l'illustrazione corretta dell'iniezione SQL perché ci sono 'segno intorno a sezioni $ e quindi non sarà possibile effettuare l'iniezione. In ogni caso ciò sarebbe possibile quando si prevede un valore intero e quando non si filtra l'input intero. Vedi il mio commento qui sotto.
'
segno prima di (
sign e quindi (SELECT
o qualsiasi altra cosa sarà proprio come stringa e non funzione. Quando il campo è intero, '
non è necessario e rende possibile tale scenario. Ma l'intero deve essere sempre filtrato con, intval()
quindi anche questo non è un problema.
'
? Quindi ' AND (SELECT ...) '
? A proposito, non credo che Zend non stia citando questo ... E se usi i binding, allora il PDO lo gestirà. Non usare mai concatenazioni di punture come questa:"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
e$db->quote()
anche nel tuo caso guarda$db->quoteInto
. Se$this
è una risorsa, si potrebbe fare:$this->getConnection('core_read')->quoteInto()
se si tratta di una collezione che si possa fare:$this->getResource()->getConnection('core_read')->quoteInto()
. lungo quelle linee. Se questo ti aiuta a raggiungere il tuo obiettivo.