Следующие исходные коды нужно избегать 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 ('ядро / ресурс') -> getTableName ('продажи / заказ') ), 'order.entity_id ='. $ some_text. ' ) -> где ('product_id =?', $ some_text) -> заказ ('main_table.order_id DESC');






Я думаю, вам не следует использовать полный оператор 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);