zend_db_expr zend query left framework php mysql zend-framework zend-db-table

php - query - evitando las inyecciones de MySQL con la clase Zend_Db



zend query (7)

¿El poco que debería hacerte sentir seguro es el? marcas en las cláusulas where Estos son parámetros, que son reemplazados de manera segura por el segundo argumento del sistema de base de datos.

Actualmente uso Zend_Db para administrar mis consultas. Ya he escrito un código que realiza consultas como la siguiente:

$handle->select()->from(''user_id'') ->where(''first_name=?'', $id) ->where(''last_name=?'', $lname)

He hecho esto sin desinfectar la entrada, suponiendo que Zend_Db lo hará. ¿Zend hace esto?

Otra pregunta: ¿Zend_Db desinfecta insert(''table'', $data) y update consultas?

Gracias.


Cuando lo necesite en otro lugar (como en join) o no está seguro si se $this->getAdapter()->quoteInto(''type = ?'',1); siempre puede usar $this->getAdapter()->quoteInto(''type = ?'',1);


La entrada de filtrado siempre es buena, porque es probable que vaya a un sitio que no sea solo el DB, y al menos quieres datos sanos en tu base de datos en algún nivel.

  • Zend_Filter_Input en el camino hacia
  • Estados preparados (o presupuestoInto si no está preparado)
  • Filtros de escape a la salida (htmlentities, etc.).


de forma predeterminada cuando usa el enlace de valor en sus consultas SQL como esta:

where(''first_name=?'', $id);

Zend_Db utiliza citas apropiadas de valores para evitar la inyección de SQL. aunque se recomienda encarecidamente (por libros, artículos, manuales y experiencia propia) desinfectar / filtrar los comentarios del usuario. Zend_Filter puede ser muy útil.


Una cosa sobre esto, cuando value es NULL, puede lograr una consulta no válida

$value = NULL; $select->where(''prop=?'', $value);

Resultado: error de SQL


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

Traté de alentar las mejores prácticas siempre que sea posible, pero tuve que encontrar el equilibrio con facilidad de uso.

Tenga en cuenta que siempre puede examinar el valor de cadena de un objeto Zend_Db_Select , para ver cómo ha decidido hacer citas.

print $select; // invokes __toString() method

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

$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 citan apropiadamente. Aunque el " ? " Parece un marcador de posición de parámetro, en este método el argumento se cita de manera apropiada e interpolado. Entonces no es un verdadero parámetro de consulta. 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, ya que se interpola palabra por palabra, para admitir los 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 su responsabilidad. Por ejemplo, si interpolas cualquier variable de PHP en la expresión, la seguridad es tu responsabilidad. Si tiene nombres de columna que son palabras clave de SQL, debe delimitarlas 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 apague AUTO_QUOTE_IDENTIFIERS .

    Los valores se parametrizan como parámetros de consulta verdaderos (no interpolados). A menos que el valor sea un objeto Zend_Db_Expr , 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 apague AUTO_QUOTE_IDENTIFIERS .

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

    El argumento $where no se filtra en absoluto, por lo que eres responsable de cualquier riesgo de inyección de SQL en ese caso. Puede utilizar el método quoteInto() para ayudar a que la cotización sea más conveniente.