2010-08-26 35 views
26

Estoy utilizando la funcionalidad de Magento para insertar consultas de actualización de &. Mi requisito es que quiero ocuparme de la Inyección SQL al hacer este tipo de consultas. Pero no puedo encontrar cómo Magento hace esto. Proporciono una muestra de inicio. Por favor, dame un ejemplo completo.Usar métodos de Magento para escribir Insertar consultas con cuidado para la inyección de SQL

<?php 
$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 
$sql = "INSERT INTO Mage_Example (Name, Email, Company, Description, Status, Date) 
    VALUES ('$name', '$email', '$company', '$desc', '0', NOW())"; 
?> 

Ahora quiero cambiar la consulta anterior para evitar la posible inyección de SQL. No quiero utilizar la función predeterminada "mysql_real_escape_string()" de PHP. ¿Alguien puede darme una solución útil, usando el controlador de base de datos "$write".

Cualquier ayuda es muy apreciada.

+0

$ contra escritura> presupuesto ($ cadena); – ppostma1

Respuesta

55

Bien, investigué este un poco. Si puede obtener una instancia de un DB_Adapter (que creo que devolverá la llamada de recurso), esto no debería ser demasiado difícil. En el fondo, Magento se basa en Zend Framework, y el adaptador DB específicamente desciende de Zend_Db_Adapter, por lo que puede utilizar esos métodos de forma gratuita. Vea el enlace anterior para más ejemplos, pero aquí está la sintaxis proporcionada en la documentación, que debe escapar de su entrada automáticamente:

$write = Mage::getSingleton("core/resource")->getConnection("core_write"); 

// Concatenated with . for readability 
$query = "insert into mage_example " 
     . "(name, email, company, description, status, date) values " 
     . "(:name, :email, :company, :desc, 0, NOW())"; 

$binds = array(
    'name' => "name' or 1=1", 
    'email' => "email", 
    'company' => "company", 
    'desc' => "desc", 
); 
$write->query($query, $binds); 

Una vez más, ver la documentación para obtener más información.


ACTUALIZACIÓN:

He cambiado el ejemplo anterior. El objeto que obtienes con tu petición core_write es un objeto PDO que expone un método query (ver arriba) que te permitirá utilizar consultas parametrizadas. Este es, con mucho, un mejor enfoque que el intento de utilizar algo como mysql_real_escape_string para la desinfección de datos, y he probado el código anterior para la corrección. Tenga en cuenta que, a diferencia de la mayoría de las consultas parametrizadas de MySQL, el enlace se hace con: labels, y también que no necesita cotizaciones para sus vars.

En respuesta a su otro punto, y como se indica a continuación, la forma "correcta" de hacerlo en Magento no es utilizar consultas directas en absoluto. Los modelos de objetos de Magento están bien desarrollados y su objetivo es abstraer este tipo de detalles de implementación lejos de ti, porque no debes preocuparte por ello. Para hacerlo "correctamente", cree un nuevo modelo basado en la base de datos y ahorre el dolor de cabeza.

+0

Gracias por la información. Pero todavía estoy en la oscuridad. Por favor corrígeme si estoy equivocado.En primer lugar, ha utilizado el objeto '' $ db' "y ha utilizado su método' 'insert()' "para insertar el registro de datos en la tabla de" errores ". Ahora lo que realmente quiero es usar el objeto "' $ write' "(de mi pregunta) en lugar de este objeto" '$ db'". ** Por favor, trátame como novato en esta arquitectura "Zend_Db". De nuevo, gracias por tu tiempo, pero ¿puedes tratar de resolverlo de acuerdo con mi pregunta? También tenga cuidado al proporcionar la solución wrt Magento específicamente y no "Zend_Db", aunque entiendo la relación entre los dos. –

+0

Para ser justos, la forma de Magento no es ejecutar el SQL directamente. Defina un modelo de datos (o un modelo de EAV) e insértelo de esa manera. mirando los otros artículos que mencionaste, así que intentaré enmendar el ejemplo. –

+0

Muchas gracias por una respuesta tan informativa y particular. Debido a mis archivos adjuntos a otros trabajos, actualmente no estoy disponible para usar su ejemplo y probar mi aplicación, pero definitivamente usaré su respuesta la semana próxima. Así que por favor, denme un poco de tiempo para marcar esto como la respuesta adecuada. Gracias de nuevo. –

2

supongo que es suficiente escaparse del $ nombre, $ correo electrónico y otras variables.

eche un vistazo a la función mysql_real_escape_string.

+0

Por favor revise mi pregunta editada. No quiero usar ninguna función PHP incorporada; solo los métodos de Magento. Proporcione más opciones y gracias por su intento. –

+0

@KC - lo siento, no estoy familiarizado con magento. estaba respondiendo algo obvio, pero parece que no es tan obvio después de todo;) – 0xAF

+0

Está bien, por su esfuerzo. +1 –

2

En el archivo de recursos.

public function saveToTable($param){ 

$table = $this->getMainTable(); 

$this->_getWriteAdapter->insert($table,array(
      'col_1'=>$param['data1'] 
      'col_2'=>$param['data2'] 
      'col_3'=>$param['data3'] 
    )); 
} 

devuelve el número de filas afectadas.

13

estoy usando esto para insertar múltiples filas a la tabla

$table = Mage::getSingleton('core/resource')->getTableName('table_name'); 
$rows = array(
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value'), 
    array('cal_1'=>'value','cal_2'=>'value','cal_3'=>'value') 
); 

public function insertRows($table,$rows) 
{ 
    $write = Mage::getSingleton('core/resource')->getConnection('core_write'); 
    $write->insertMultiple($table,$rows); 
} 
Cuestiones relacionadas