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

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

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

27
задан Knowledge Craving 26 August 2010 в 13:02
поделиться

2 ответа

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

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


ОБНОВЛЕНИЕ:

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

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

60
ответ дан 28 November 2019 в 04:23
поделиться

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

взгляните на функцию mysql_real_escape_string.

2
ответ дан 28 November 2019 в 04:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: