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

dkqlctbz  于 2023-02-03  发布在  PHP
关注(0)|答案(2)|浏览(94)

我目前正在为我的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

s5a0g9ez

s5a0g9ez1#

这个错误非常明显(我想你不会问这个问题):
靠近's-NutRageous-Smaller.jpg'

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

我要说的是,您用来生成这些查询的软件未能使用预准备语句或转义输入;这使得它太笨重而无法使用。

编辑:出于好奇,我快速浏览了一下代码,在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++);

...其中getCell()是从Excel读取字符串的函数。需要SQL注入攻击的丑陋代码。

oyjwcjzk

oyjwcjzk2#

在操作数据库时,您应该使用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');

相关问题