2010-08-26 95 views
26

我正在使用Magento的功能来插入&更新查询。我的要求是,我想在处理这些类型的查询时处理SQL注入。但我无法找到Magento如何做到这一点。我提供了一个开始样本。请给我一个完整的例子。使用Magento方法编写插入查询并注意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())"; 
?> 

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

任何帮助,非常感谢。

+0

$直写>报价($字符串); – ppostma1 2015-12-09 19:19:10

回答

55

好的,研究一下这一点。如果你可以得到一个DB_Adapter的实例(我相信资源调用会返回),这应该不会太难。在内部深处,Magento基于Zend Framework,并且数据库适配器特别来自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); 

再次看到文档的更多信息。


UPDATE:

我已经改变了上面的例子。你用core_write请求得到的对象是一个PDO对象,它公开了一个query方法(见上),它可以让你使用参数化查询。这是BY FAR比试图将mysql_real_escape_string用于数据清理更好的方法,并且我已经测试了上述代码的正确性。请注意,与大多数MySQL参数化查询相比,绑定是使用:labels完成的,并且您不需要引用vars。

为了回应您的其他观点,并且如下所述,在Magento中执行此操作的“正确”方法不是直接使用查询。 Magento对象模型的开发非常好,并且意在将这种实现细节从您身上抽象出来,因为您不需要关心它。要做到“正确”,创建一个新的基于数据库的模型并保存头痛。

+0

感谢您的信息。但我仍然处于黑暗中。如果我错了,请纠正我。首先,您使用了“'db_db'”对象并使用其“insert()'”方法将数据记录插入到“bugs”表中。现在我真正想要的是使用“'$ write'”对象(我的问题)而不是这个“'$ db'”对象。 **请在这个“Zend_Db”架构中将我当作新手。**再次感谢您的时间,但是您能否根据我的问题尝试解决它?也请注意提供与Magento特别的解决方案,而不是“Zend_Db”,尽管我理解这两者之间的关系。 – 2010-08-26 20:24:06

+0

公平地说,Magento的方法不是直接执行SQL。定义数据模型(或EAV模型)并以此方式插入。看着你提到的其他项目,所以我会尝试修改这个例子。 – 2010-08-26 23:55:27

+0

非常感谢这样的信息和特殊的答案。由于我对其他作品的依恋,目前我无法使用您的示例和测试我的应用程序,但我肯定会在接下来的一周内使用您的答案。所以请给我一点时间,以标记为合适的答案。再次感谢。 – 2010-08-28 06:03:05

2

我想逃避$名称,$电子邮件和其他变量将是足够的。

看看mysql_real_escape_string函数。

+0

请检查我编辑的问题。我不想使用任何内置的PHP函数;只有Magento的方法。请提供更多选项并感谢您的尝试。 – 2010-08-26 13:13:39

+0

@KC - 对不起,我不熟悉magento。我回答的只是一个明显的事情,但它似乎并不是那么明显;) – 0xAF 2010-08-27 01:26:06

+0

没关系,为了你的努力。 +1 – 2010-08-27 07:40:00

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'] 
    )); 
} 

返回受影响的行数。

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