Mysql
 sql >> Database >  >> RDS >> Mysql

evitando iniezioni MySQL con la classe Zend_Db

Ho scritto molto del codice per i parametri del database e le quotazioni in Zend Framework mentre ero il capo del team per il progetto (fino alla versione 1.0).

Ho cercato di incoraggiare le migliori pratiche ove possibile, ma ho dovuto trovare un equilibrio con la facilità d'uso.

Nota che puoi sempre esaminare il valore della stringa di un Zend_Db_Select oggetto, per vedere come ha deciso di fare la citazione.

print $select; // invokes __toString() method

Inoltre puoi usare Zend_Db_Profiler per ispezionare l'SQL eseguito per tuo conto da Zend_Db .

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

Ecco alcune risposte alle tue domande specifiche:

  • Zend_Db_Select::where('last_name=?', $lname)

    I valori sono citati in modo appropriato. Sebbene il "? " sembra un segnaposto di parametro, in questo metodo l'argomento è effettivamente citato e interpolato in modo appropriato. Quindi non è un vero parametro di query. In effetti, le due istruzioni seguenti producono esattamente la stessa query dell'utilizzo precedente:

    $select->where( $db->quoteInto('last_name=?', $lname) );
    $select->where( 'last_name=' . $db->quote($lname) );
    

    Tuttavia, se si passa un parametro che è un oggetto di tipo Zend_Db_Expr , quindi non è citato. Sei responsabile dei rischi di SQL injection, perché è interpolato testualmente, per supportare i valori delle espressioni:

    $select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
    

    Qualsiasi altra parte di tale espressione che deve essere citata o delimitata è sotto la tua responsabilità. Ad esempio, se interpoli qualsiasi variabile PHP nell'espressione, la sicurezza è tua responsabilità. Se hai nomi di colonna che sono parole chiave SQL, devi delimitarli tu stesso con quoteIdentifier() . Esempio:

    $select->where($db->quoteIdentifier('order').'=?', $myVariable)
    
  • Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )

    I nomi delle tabelle e delle colonne sono delimitati, a meno che non disattivi AUTO_QUOTE_IDENTIFIERS .

    I valori sono parametrizzati come parametri di query reali (non interpolati). A meno che il valore non sia un Zend_Db_Expr oggetto, nel qual caso è interpolato testualmente, quindi puoi inserire espressioni o NULL o altro.

  • Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )

    I nomi delle tabelle e delle colonne sono delimitati, a meno che non disattivi AUTO_QUOTE_IDENTIFIERS .

    I valori sono parametrizzati, a meno che non siano Zend_Db_Expr oggetti, come in insert() metodo.

    Il $where argomento non è affatto filtrato, quindi sei responsabile di eventuali rischi di SQL injection in quello. Puoi utilizzare quoteInto() metodo per rendere più conveniente la quotazione.