为什么我在使用OpenCart的导入脚本时收到MySQL错误1064


Why am I recieving MySQL Error 1064 when using an import script for OpenCart?

我目前正在为我的OpenCart电子商务商店使用导入/导出模块。

该模块的工作原理是将OpenCart类别和产品数据库导出到excel表中,然后可以对其进行编辑和导入。我们决定使用这个模块来批量进口我们的产品。

在我收到以下错误之前,前953个产品完美导入:

Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's-NutRageous-Smaller.jpg',1,0.825,0,'2012-11-04 12:56:45','2013-12-01 14:19:41',' at line 1
Error No: 1064
INSERT INTO `oc_product` (`product_id`,`quantity`,`sku`,`upc`,`ean`,`jan`,`isbn`,`mpn`,`location`,`stock_status_id`,`model`,`manufacturer_id`,`image`,`shipping`,`price`,`points`,`date_added`,`date_modified`,`date_available`,`weight`,`weight_class_id`,`status`,`tax_class_id`,`viewed`,`length`,`width`,`height`,`length_class_id`,`sort_order`,`subtract`,`minimum`) VALUES (1060,0,'','','','','','','',5,'Reeses_Nutrageous_Bars_51g',22,'data/Reese's-NutRageous-Smaller.jpg',1,0.825,0,'2012-11-04 12:56:45','2013-12-01 14:19:41','2012-11-03',0.05,1,1,9,1930,1,2,3,'2','1','1','1'); in /var/www/vhosts/localhost.localdomain/americanfizz.info/system/database/mysql.php on line 50

我不认为这是电子表格格式的问题,因为我已经尝试删除";"冒犯";产品,但当它到达线路954时,它总是失败。

起初,由于数据库的大小,我在导入时遇到了问题,但在导入时,我暂时将php.ini中的memory_limit调整为-1,从而解决了这个问题。出于参考目的,我正在使用的导入脚本可以在这里找到:http://www.opencart.com/index.php?route=extension/extension/info&extension_id=17

错误非常明显(我想你不是在问这个问题):

接近"s-NutRageous-Smaller.jpg"

22,'data/Reese's-NutRageous-Smaller.jpg'
   ^          ^                        ^
   |          |                        |
   ' Start    |                        ' End
              ' Faux end

我想说的是,你用来生成这些查询的软件没有使用准备好的语句或转义输入;这使得它太bug而无法使用。


编辑:出于好奇,我快速查看了代码,并在upload/admin/model/tool/export.php上找到了它

$sql  = "INSERT INTO `".DB_PREFIX."product` (`product_id`,`quantity`,`sku`,`upc`,`ean`,`jan`,`isbn`,`mpn`,`location`,";
$sql .= "`stock_status_id`,`model`,`manufacturer_id`,`image`,`shipping`,`price`,`points`,`date_added`,`date_modified`,`date_available`,`weight`,`weight_class_id`,`status`,";
$sql .= "`tax_class_id`,`viewed`,`length`,`width`,`height`,`length_class_id`,`sort_order`,`subtract`,`minimum`) VALUES ";
$sql .= "($productId,$quantity,'$sku','$upc','$ean','$jan','$isbn','$mpn','$location',";
$sql .= "$stockStatusId,'$model',$manufacturerId,'$imageName',$shipping,$price,$points,";
$sql .= ($dateAdded=='NOW()') ? "$dateAdded," : "'$dateAdded',";
$sql .= ($dateModified=='NOW()') ? "$dateModified," : "'$dateModified',";
$sql .= ($dateAvailable=='NOW()') ? "$dateAvailable," : "'$dateAvailable',";
$sql .= "$weight,$weightClassId,$status,";
$sql .= "$taxClassId,$viewed,$length,$width,$height,'$lengthClassId','$sort_order','$subtract','$minimum');";

往上走,这就是$imageName的来源:

$imageName = $this->getCell($data,$i,$j++);

其中CCD_ 2是从Excel读取字符串的函数。综上所述:丑陋的代码正在调用SQL注入攻击。

在使用数据库进行操作时,您应该sanitize每个输入参数。

INSERT INTO `oc_product` (`product_id`,`quantity`,`sku`,`upc`,`ean`,`jan`,`isbn`,`mpn`,`location`,`stock_status_id`,`model`,`manufacturer_id`,`image`,`shipping`,`price`,`points`,`date_added`,`date_modified`,`date_available`,`weight`,`weight_class_id`,`status`,`tax_class_id`,`viewed`,`length`,`width`,`height`,`length_class_id`,`sort_order`,`subtract`,`minimum`) VALUES (1060,0,'','','','','','','',5,'Reeses_Nutrageous_Bars_51g',22,'data/Reese''s-NutRageous-Smaller.jpg',1,0.825,0,'2012-11-04 12:56:45','2013-12-01 14:19:41','2012-11-03',0.05,1,1,9,1930,1,2,3,'2','1','1','1');