Использование методов Magento для написания запросов на вставку с осторожностью для SQL-инъекций - PullRequest
27 голосов
/ 26 августа 2010

Я использую функциональность 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 ]

59 голосов
/ 26 августа 2010

Хорошо, немного исследовал это.Если вы можете получить экземпляр 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, привязка выполняется с метками:, а также что вам не нужны кавычки для ваших переменных.

В ответ на ваш другой пункт и, как отмечено ниже,Правильный "способ сделать это в Magento - это вообще не использовать прямые запросы.Объектные модели Magento хорошо разработаны и предназначены для отвлечения от вас деталей реализации такого рода, потому что вам не нужно беспокоиться об этом.Чтобы сделать это «правильно», создайте новую модель на основе базы данных и сохраните головную боль.

13 голосов
/ 21 марта 2014

Я использую это для вставки нескольких строк в таблицу

$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 голосов
/ 23 марта 2013

В файле ресурсов.

public function saveToTable($param){

$table = $this->getMainTable(); 

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

возвращает количество затронутых строк.

2 голосов
/ 26 августа 2010

Думаю, будет достаточно экранирования $ name, $ email и других переменных.

взгляните на mysql_real_escape_string function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...