2015-01-09 86 views
2

在我的应用程序,我需要提供上传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的变量是由我的程序设定,所以他们不会是一个问题,但我我非常关心更新/插入值的安全性。有没有什么方法可以将本地负载数据与负载数据一起转义而不会造成性能损失?

回答

4

如果我明白你在问什么......没有必要“逃避”由LOAD DATA声明读入的文件中的值。这些值被解释为数据,而不是作为SQL文本的一部分。

也就是说,如果从文件读入的值类似于NOW(),那将读作字符串。如果该值被存储到VARCHAR列中,则该字符串值将存储在该列中;该字符串的内容不会被解释为“调用SQL函数”。

的LOAD DATA类似于与绑定占位符,例如准备语句:

INSERT INTO MYTABLE(A,B,C)值,((,?,??)(,,????) ?,?,?)

为占位符提供的值仅作为数据处理,它们不是SQL文本的一部分。

注意:这并不保证存储在表中的值是“安全的”。 LOAD DATA语句是安全的。完全有可能通过其他一些陈述来提取该值,然后将其他一些陈述不正确地处理该值作为潜在的不安全因素并造成严重破坏。


编辑

我回答说,LOAD DATA说法是不容易受到SQL注入,尽可能从文件中读取值。

只是为了澄清,则这部分代码:

$stmt4 = $dbh->prepare("LOAD DATA LOCAL INFILE '/ama/$aa[0]/CustomerUpload/$a.csv' INTO 

被(潜在地)容易受到注射,从$aa$a被包括在SQL文本。

+0

谢谢你的回答!这意味着我不需要担心加载数据操作,但是之后的更新语句呢?如果我想进一步,我有一个没有转义的查询字符串后,我的临时表中的加载数据操作,然后运行更新查询没有这样做正在准备(我没有找到一种方式与$ stmt5这样做),那么在这个查询中我没有漏洞呢? – baao 2015-01-09 20:59:07

+0

如果'$ stmt5'中存在漏洞,则它位于'$ {prefix}'变量的内容中。由'UPDATE'语句处理的列的值仅处理数据。 (我唯一看到的其他潜能是UPDATE目标表上的易受攻击的UPDATE触发器的角落情况...触发器必须编码以准备和执行动态SQL(甚至在触发器中允许)。 UPDATE语句本身不容易受到表中存储的“不安全”值的影响 – spencer7593 2015-01-09 21:42:14

+0

好的,再次感谢!$前缀是由一个开关/白名单组成的,以避免此处的漏洞。 – baao 2015-01-09 21:45:55