sql >> Base de Datos >  >> RDS >> Mysql

evitando inyecciones de MySQL con la clase Zend_Db

Escribí gran parte del código para los parámetros de la base de datos y citas en Zend Framework mientras era el líder del equipo para el proyecto (hasta la versión 1.0).

Traté de fomentar las mejores prácticas en la medida de lo posible, pero tenía que lograr un equilibrio con la facilidad de uso.

Tenga en cuenta que siempre puede examinar el valor de cadena de un Zend_Db_Select objeto, a ver cómo ha decidido hacer la cotización.

print $select; // invokes __toString() method

También puedes usar el Zend_Db_Profiler para inspeccionar el SQL que se ejecuta en su nombre por Zend_Db .

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

Aquí hay algunas respuestas a sus preguntas específicas:

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

    Los valores se cotizan apropiadamente. Aunque el "? " parece un marcador de posición de parámetro; en este método, el argumento se cita correctamente y se interpola. Por lo tanto, no es un parámetro de consulta verdadero. De hecho, las siguientes dos declaraciones producen exactamente la misma consulta que el uso anterior:

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

    Sin embargo, si pasa un parámetro que es un objeto de tipo Zend_Db_Expr , entonces no se cita. Usted es responsable de los riesgos de inyección SQL, porque se interpola palabra por palabra, para admitir valores de expresión:

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

    Cualquier otra parte de esa expresión que necesite ser citada o delimitada es de su responsabilidad. Por ejemplo, si interpola cualquier variable de PHP en la expresión, la seguridad es su responsabilidad. Si tiene nombres de columna que son palabras clave de SQL, debe delimitarlos usted mismo con quoteIdentifier() . Ejemplo:

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

    El nombre de la tabla y los nombres de las columnas están delimitados, a menos que desactive AUTO_QUOTE_IDENTIFIERS .

    Los valores se parametrizan como parámetros de consulta verdaderos (no interpolados). A menos que el valor sea un Zend_Db_Expr objeto, en cuyo caso se interpola palabra por palabra, por lo que puede insertar expresiones o NULL o lo que sea.

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

    El nombre de la tabla y los nombres de las columnas están delimitados, a menos que desactive AUTO_QUOTE_IDENTIFIERS .

    Los valores están parametrizados, a menos que sean Zend_Db_Expr objetos, como en insert() método.

    El $where El argumento no se filtra en absoluto, por lo que usted es responsable de cualquier riesgo de inyección de SQL en ese. Puede hacer uso de quoteInto() para ayudar a que la cotización sea más conveniente.