我需要在此示例magento代码中避免sql注入吗?

时间:2018-07-18 06:24:53

标签: php magento sql-injection

以下源代码需要避免使用sql-injection吗? 如果示例的$some_textsql-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('core / resource')-> getTableName('sales / order')         ),         'order.entity_id ='。 $ some_text。 '     )     ->其中('product_id =?',$ some_text)     -> order('main_table.order_id DESC');

2 个答案:

答案 0 :(得分:1)

我认为您不应该使用完整的SQL语句。因此,不应使用“ (4)使用fetchAll()style2

答案 1 :(得分:1)

Magento使用带数据库支持的绑定变量的预准备语句。它们由PDO,MySQLi和其他库提供。 如果数据库层不支持绑定变量,则使用数据库特定的字符串转义函数(例如,mysql_real_escape_string(),addslashes(),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')

输出集合为::

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 AS statuseentity_idetype_ideattribute_set_id,{{ 1}}。eskucatalog_product_flat_1在哪里(e.sku ='\“ OR \” \“ = \”')

OUTPUT集合为::什么都没有

产品收集数据=数组 ( )

避免SQL注入漏洞的最佳建议是“不要直接查询数据库”。您应该使用在这种情况下可以保护您的ORM。尤其是从EAV表中获取数据时。

但是,如果您通过参数输入运行本机sql查询,则应使用Zend_Db_Select的绑定将查询参数绑定到查询,而不要使用完整的SQL语句:

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