【问题标题】:Using Magento Methods to write Insert Queries with care for SQL Injection使用 Magento 方法编写插入查询,小心 SQL 注入
【发布时间】:2010-08-26 12:48:34
【问题描述】:

我正在使用 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”数据库处理程序。

非常感谢任何帮助。

【问题讨论】:

  • $write->quote($string);

标签: magento sql-injection


【解决方案1】:

好的,稍微研究了一下这个。如果您可以获得 DB_Adapter 的实例(我相信资源调用将返回),这应该不会太难。 Magento 内部是基于 Zend 框架的,而 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 参数化查询相比,绑定是使用 :labels 完成的,而且您的 var 不需要引号。

针对您的另一点,如下所述,在 Magento 中执行此操作的“正确”方法是根本不使用直接查询。 Magento 对象模型开发得很好,旨在从您那里抽象出这种实现细节,因为您不需要关心它。要“正确”地做到这一点,请创建一个新的基于数据库的模型并省去麻烦。

【讨论】:

  • 感谢您的信息。但我仍然在黑暗中。如果我错了,请纠正我。首先,您使用了“$db”对象并使用其“insert()”方法将数据记录插入到“bugs”表中。现在我真正想要的是使用“$write”对象(我的问题)而不是这个“$db”对象。 请把我当作这个“Zend_Db”架构的新手。再次感谢您抽出宝贵的时间,但您能根据我的问题尝试解决它吗?另外请注意提供专门针对 Magento 而不是“Zend_Db”的解决方案,尽管我了解两者之间的关系。
  • 公平地说,Magento 的方式根本不是直接执行 SQL。定义数据模型(或 EAV 模型)并以这种方式插入。查看您提到的其他项目,因此我将尝试修改示例。
  • 非常感谢您提供如此丰富且特别的答案。由于我对其他作品的附件,我目前无法使用您的示例并测试我的应用程序,但我肯定只会在接下来的一周内使用您的答案。所以请给我一点时间,把它标记为合适的答案。再次感谢。
【解决方案2】:

我正在使用它向表中插入多行

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

【讨论】:

    【解决方案3】:

    我想转义 $name、$email 和其他变量就足够了。

    看看mysql_real_escape_string函数。

    【讨论】:

    • 请检查我编辑的问题。我不想使用任何内置的 PHP 函数;只有 Magento 的方法。请提供更多选项并感谢您的尝试。
    • @KC - 抱歉,我不熟悉 magento。我正在回答公正而明显的事情,但似乎毕竟不是那么明显;)
    • 没关系,你的努力。 +1
    【解决方案4】:

    在资源文件中。

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

    返回受影响的行数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2013-11-26
      相关资源
      最近更新 更多