sql >> Database >  >> RDS >> Mysql

MySQL-injecties vermijden met de klasse Zend_Db

Ik heb veel van de code voor databaseparameters en citaten in Zend Framework geschreven terwijl ik de teamleider van het project was (tot versie 1.0).

Ik probeerde waar mogelijk best practices aan te moedigen, maar ik moest een balans vinden tussen gebruiksgemak.

Merk op dat je altijd de stringwaarde van een Zend_Db_Select . kunt bekijken bezwaar, om te zien hoe het heeft besloten om te citeren.

print $select; // invokes __toString() method

U kunt ook de Zend_Db_Profiler . gebruiken om de SQL te inspecteren die namens u wordt uitgevoerd door Zend_Db .

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

Hier zijn enkele antwoorden op uw specifieke vragen:

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

    Waarden worden op de juiste manier geciteerd. Hoewel de "? " lijkt op een tijdelijke aanduiding voor een parameter, in deze methode wordt het argument op de juiste manier geciteerd en geïnterpoleerd. Het is dus geen echte queryparameter. In feite produceren de volgende twee instructies precies dezelfde query als het bovenstaande gebruik:

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

    Als u echter een parameter doorgeeft die een object is van het type Zend_Db_Expr , dan wordt het niet geciteerd. U bent verantwoordelijk voor SQL-injectierisico's, omdat het woordelijk wordt geïnterpoleerd om expressiewaarden te ondersteunen:

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

    Elk ander deel van die uitdrukking dat moet worden geciteerd of afgebakend, is uw verantwoordelijkheid. Als u bijvoorbeeld PHP-variabelen in de uitdrukking interpoleert, is veiligheid uw verantwoordelijkheid. Als u kolomnamen heeft die SQL-sleutelwoorden zijn, moet u deze zelf afbakenen met quoteIdentifier() . Voorbeeld:

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

    Tabelnaam en kolomnamen zijn gescheiden, tenzij u AUTO_QUOTE_IDENTIFIERS uitschakelt .

    Waarden worden geparametriseerd als echte queryparameters (niet geïnterpoleerd). Tenzij de waarde een Zend_Db_Expr . is object, in welk geval het woordelijk wordt geïnterpoleerd, zodat u expressies of NULL kunt invoegen of wat dan ook.

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

    Tabelnaam en kolomnamen zijn gescheiden, tenzij u AUTO_QUOTE_IDENTIFIERS uitschakelt .

    Waarden zijn geparametriseerd, tenzij ze Zend_Db_Expr . zijn objecten, zoals in insert() methode.

    De $where argument is helemaal niet gefilterd, dus u bent verantwoordelijk voor eventuele SQL-injectie-risico's in die. U kunt gebruik maken van de quoteInto() methode om het citeren gemakkelijker te maken.



  1. MySQL JDBC-stuurprogramma 5.1.33 - Tijdzoneprobleem

  2. De beste manier om hstore op meerdere schema's in een Postgres-database te installeren?

  3. Hoe een externe MySQL-verbinding in te stellen

  4. Is er een reden om nog steeds snake case te gebruiken voor databasetabellen en kolommen?