Подтвердить что ты не робот

Использование методов Magento для записи запросов вставки с осторожностью в SQL Injection

Я использую функциональность Magento для вставки и обновления запросов. Мое требование состоит в том, что я хочу позаботиться о SQL Injection при выполнении этих типов запросов. Но я не могу найти, как 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()" по умолчанию. Может ли кто-нибудь предложить мне одно полезное решение, используя обработчик DB "$write".

Любая помощь очень ценится.

4b9b3361

Ответ 1

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

Снова, см. документы для получения дополнительной информации.


UPDATE:

Я изменил приведенный выше пример. Объект, возвращаемый вашим запросом core_write, является объектом PDO, который предоставляет метод query (см. Выше), который позволит вам использовать параметризованные запросы. Это BY FAR лучший подход, чем попытка использовать что-то вроде mysql_real_escape_string для дезактивации данных, и я проверил приведенный выше код на предмет правильности. Обратите внимание, что в отличие от большинства запросов с параметрами MySQL, привязка выполняется с помощью: ярлыков, а также для того, что вам не нужны кавычки для ваших варов.

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

Ответ 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.

Ответ 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']
      ));
}

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