以下源代码需要避免使用sql-injection
吗?
如果示例的$some_text
是sql-injected
攻击,那么以下源代码很危险吗?
通用Magento代码
$tmp_sale_info_collection = Mage::getModel('some/module')
->getCollection()
->addFieldToFilter('seller_id', array('eq' => $some_text));
使用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');
使用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);
使用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);
哪个危险而哪些不危险?
===================编辑===========================
修改秒
$ 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');
答案 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 status
,e
。entity_id
,e
。type_id
,e
。attribute_set_id
,{{ 1}}。e
从sku
到catalog_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);