在我的应用程序,我需要提供上传csv和excel文件,然后用于更新数据库的可能性。该文件包含+/-几百万行,所以我需要使用装载本地数据INFILE:如何保护加载数据本地infile更新查询针对sql注入
$stmt1 = $dbh->prepare("CREATE TEMPORARY TABLE ${prefix}tempskuEAN LIKE ${prefix}skuEAN");
$stmt4 = $dbh->prepare("LOAD DATA LOCAL INFILE '/ama/$aa[0]/CustomerUpload/$a.csv' INTO TABLE ${prefix}tempskuEAN FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' (seller_sku, EAN, fallback)");
$stmt5 = $dbh->prepare("UPDATE ${prefix}skuEAN a LEFT JOIN ${prefix}tempskuEAN b ON a.seller_sku = b.seller_sku SET a.EAN = b.EAN, a.fallback = b.fallback WHERE a.seller_sku = b.seller_sku");
$stmt6 = $dbh->prepare("DROP TEMPORARY TABLE ${prefix}tempskuEAN");
在$ stmt4的变量是由我的程序设定,所以他们不会是一个问题,但我我非常关心更新/插入值的安全性。有没有什么方法可以将本地负载数据与负载数据一起转义而不会造成性能损失?
谢谢你的回答!这意味着我不需要担心加载数据操作,但是之后的更新语句呢?如果我想进一步,我有一个没有转义的查询字符串后,我的临时表中的加载数据操作,然后运行更新查询没有这样做正在准备(我没有找到一种方式与$ stmt5这样做),那么在这个查询中我没有漏洞呢? – baao 2015-01-09 20:59:07
如果'$ stmt5'中存在漏洞,则它位于'$ {prefix}'变量的内容中。由'UPDATE'语句处理的列的值仅处理数据。 (我唯一看到的其他潜能是UPDATE目标表上的易受攻击的UPDATE触发器的角落情况...触发器必须编码以准备和执行动态SQL(甚至在触发器中允许)。 UPDATE语句本身不容易受到表中存储的“不安全”值的影响 – spencer7593 2015-01-09 21:42:14
好的,再次感谢!$前缀是由一个开关/白名单组成的,以避免此处的漏洞。 – baao 2015-01-09 21:45:55