使用Magento方法编写插入查询,注意SQL注入

时间:2010-08-26 12:48:34

标签: magento sql-injection

我正在使用Magento的功能来插入&更新查询。我的要求是在进行这些类型的查询时我想要处理SQL注入。但我无法找到Magento是如何做到这一点的。我正在提供一个开始样本。请给我一个完整的例子。

<?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())";
?>

现在我想更改上面的查询以防止可能的SQL注入。我不想使用PHP的默认“mysql_real_escape_string()”内置函数。任何人都可以使用“$write”数据库处理程序为我提供一个有用的解决方案。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:58)

好的,稍微研究了一下。如果您可以获得DB_Adapter的实例(我相信资源调用将返回),这应该不会太难。在内部深处,Magento基于Zend Framework,而DB适配器特别是Zend_Db_Adapter的后代,因此您可以免费使用这些方法。有关更多示例,请参阅之前的链接,但这里是文档中提供的语法,它应该自动转义输入:

$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);

再次,请参阅文档以获取更多信息。


更新:

我改变了上面的例子。使用core_write请求返回的对象是一个PDO对象,它公开了一个query方法(见上文),它允许您使用参数化查询。这是比尝试使用类似mysql_real_escape_string之类的数据清理更好的方法,而且我已经测试了上面的代码是否正确。请注意,与大多数MySQL参数化查询相比,绑定是通过:标签完成的,并且您的vars也不需要引号。

回应您的另一点,并且如下所述,在Magento中执行此操作的“正确”方法是根本不使用直接查询。 Magento对象模型很好地开发,旨在将这种实现细节抽象出来,因为您不需要关心它。要“正确”执行此操作,请创建一个新的基于数据库的模型并避免头痛。

答案 1 :(得分:13)

我用它来向表中插入多行

$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);
}

答案 2 :(得分:2)

我想逃避$ name,$ email和其他变量。

查看mysql_real_escape_string功能。

答案 3 :(得分:2)

在资源文件中。

public function saveToTable($param){

$table = $this->getMainTable(); 

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

返回受影响的行数。