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

undgå MySQL-injektioner med Zend_Db-klassen

Jeg skrev meget af koden til databaseparametre og citerede i Zend Framework, mens jeg var teamleder for projektet (op til version 1.0).

Jeg forsøgte at opmuntre til bedste praksis, hvor det var muligt, men jeg var nødt til at finde en balance med brugervenlighed.

Bemærk, at du altid kan undersøge strengværdien af ​​en Zend_Db_Select objekt, for at se, hvordan den har besluttet at citere.

print $select; // invokes __toString() method

Du kan også bruge Zend_Db_Profiler at inspicere den SQL, der køres på dine vegne af Zend_Db .

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

Her er nogle svar på dine specifikke spørgsmål:

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

    Værdier er citeret korrekt. Selvom "? " ligner en parameterpladsholder, i denne metode er argumentet faktisk citeret korrekt og interpoleret. Så det er ikke en sand forespørgselsparameter. Faktisk producerer de følgende to udsagn nøjagtig den samme forespørgsel som ovenstående brug:

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

    Men hvis du sender en parameter, der er et objekt af typen Zend_Db_Expr , så er det ikke citeret. Du er ansvarlig for SQL-injektionsrisici, fordi det er interpoleret ordret, for at understøtte udtryksværdier:

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

    Enhver anden del af det udtryk, der skal citeres eller afgrænses, er dit ansvar. Hvis du f.eks. interpolerer PHP-variabler i udtrykket, er sikkerheden dit ansvar. Hvis du har kolonnenavne, der er SQL-nøgleord, skal du selv afgrænse dem med quoteIdentifier() . Eksempel:

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

    Tabelnavn og kolonnenavne er afgrænset, medmindre du slår AUTO_QUOTE_IDENTIFIERS fra .

    Værdier parametreres som sande forespørgselsparametre (ikke interpoleret). Medmindre værdien er en Zend_Db_Expr objekt, i hvilket tilfælde det er interpoleret ordret, så du kan indsætte udtryk eller NULL eller hvad som helst.

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

    Tabelnavn og kolonnenavne er afgrænset, medmindre du slår AUTO_QUOTE_IDENTIFIERS fra .

    Værdier parametreres, medmindre de er Zend_Db_Expr objekter, som i insert() metode.

    $where argumentet filtreres slet ikke, så du er ansvarlig for eventuelle SQL-injektionsrisici i den. Du kan gøre brug af quoteInto() metode til at gøre det mere bekvemt at citere.



  1. Sender kolonnenavn som parameter i MySQL

  2. Oracle Pivot-forespørgsel giver kolonner med anførselstegn omkring kolonnenavnene. Hvad?

  3. 3 måder at få den første dag i måneden i SQL Server

  4. Du kan nu bruge Access med Microsoft Azure MFA!