Нужно ли мне избегать внедрения sql в этом примере кода magento?

Следующие исходные коды нужно избегать sql-injection? если $some_text примера - это атака sql-injected, следующие исходные коды опасны?

  1. Общий код Magento

    $tmp_sale_info_collection = Mage::getModel('some/module')
        ->getCollection()
        ->addFieldToFilter('seller_id', array('eq' => $some_text));
    
  2. Использовать внутреннее соединение getSelect()

    $orderItem = Mage::getModel('sales/order_item')->getCollection();
    $orderItem->getSelect()
        ->joinInner(
            array(
                'order' => Mage::getSingleton('core/resource')->getTableName('sales/order')
            ), 
            'order.entity_id = main_table.order_id'
        )
        ->where('product_id=?', $some_text)
        ->order('main_table.order_id DESC');
    
  3. Использовать fetchAll() style1

    $select = $adapter->select()
        ->from($table, array())
        ->where($entityTypeIdField . ' =?', $some_text)
        ->where('attribute_id =?', $some_text)
        ->where('store_id =?', $some_text)
        ->columns('*');
    
    $values = $adapter->fetchAll($select);
    
  4. Используйте fetchAll() style2

    $sql_select = "SELECT * from onetable where from_id ='$some_text'";
    $resource = Mage::getModel('core/resource');
    $read = $resource->getConnection('core_read');
    $results = $read->fetchAll($sql_select);
    

Какой из них опасен, а какой нет?

=================== РЕДАКТИРОВАТЬ ===========================

  1. модифицированная секунда

    $ orderItem = Mage :: getModel ('sales / order_item') -> getCollection (); $ orderItem-> getSelect () -> joinInner ( множество( 'order' => Mage :: getSingleton ('ядро / ресурс') -> getTableName ('продажи / заказ') ), 'order.entity_id ='. $ some_text. ' ) -> где ('product_id =?', $ some_text) -> заказ ('main_table.order_id DESC');

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
581
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вам не следует использовать полный оператор SQL. Итак, не следует использовать "(4) Используйте fetchAll () style2"

Ответ принят как подходящий

Magento Используйте подготовленные операторы со связанными переменными, которые поддерживаются базой данных. Они предоставляются PDO, MySQLi и другими библиотеками. Если уровень базы данных не поддерживает переменные привязки, укажите в кавычках каждое нечисловое значение, предоставленное пользователем, которое передается в базу данных, с помощью специальной строковой escape-функции, например mysql_real_escape_string (), addlashes (), magic_quotes_gpc, get_magic_quotes_gpc (), stripslashes ( ), htmlentities, htmlspecialchars.

Только для вас, например:

Здесь я использовал ваш первый запрос:

$productSku = array('101_7898_2200');
//$productSku = array('" OR "" = "');//  sku= "' OR ''='"; And sku= '" OR "" = "';

$attributes = Mage::getSingleton('catalog/config')->getProductAttributes();
$collection = Mage::getModel('catalog/product')
            ->getCollection()                
            ->addAttributeToFilter('sku', array('eq' => $productSku));
           // ->addAttributeToSelect($attributes);

echo "<pre> product collection query = "; print_r($collection->getSelect()->__toString()); 
echo "<pre> product collection data = "; print_r($collection->getData());

Здесь SQL-запрос:

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`sku` FROM `catalog_product_flat_1` AS `e` WHERE (e.sku = '101_7898_2200')

Коллекция OUTPUT:

Array
(
[0] => Array
    (
        [status] => 1
        [entity_id] => 22835
        [type_id] => configurable
        [attribute_set_id] => 9
        [sku] => 101_7898_2200
    )

)

НО, когда я передал введенный параметр sql, который является sku = "'OR' '='"; И sku = '"OR" "="'; после этого мы получаем следующий результат:

SQL-запрос:

ВЫБРАТЬ 1 КАК status, e.entity_id, e.type_id, e.attribute_set_id, e.sku ИЗ catalog_product_flat_1 КАК e ГДЕ (e.sku = '\ "OR \" \ "= \"')

Коллекция OUTPUT :: Ничего

данные о сборе товаров = массив ( )

Лучший совет, чтобы избежать уязвимости, связанной с внедрением SQL-кода, - «не запрашивать базу данных напрямую». Вы должны использовать ORM, который защитит вас в таких ситуациях. Особенно при извлечении данных из таблиц EAV.

Однако, если вы выполняете собственный sql-запрос с вводом параметров, вам следует связать параметры запроса с запросом с помощью привязки Zend_Db_Select, а не использовать полный оператор SQL:

$ query = $ this -> _ connection-> select () -> from ('eav_attribute') -> где ('attribute_id =?', $ attributeId); $ result = $ this -> _ connection-> fetchAll ($ query);

Другие вопросы по теме