如何保护加载数据本地infile更新查询对SQL注入

时间:2015-01-09 20:30:38

标签: mysql security pdo sql-injection load-data-infile

在我的应用程序中,我需要提供上传csv和excel文件的可能性,然后用于更新数据库。这些文件包含+/-几百万行,所以我需要使用load local data infile:

$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中的变量是由我的程序设置的,所以它们不会成为问题,但我非常担心更新/插入值的安全性。有没有办法在没有性能损失的情况下将值与本地infile加载数据一起转义?

1 个答案:

答案 0 :(得分:4)

如果我理解你的要求......那么就没有必要逃避" LOAD DATA语句读入的文件中的值。这些值被解释为数据,而不是SQL文本的一部分。

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

LOAD DATA类似于带有绑定占位符的预处理语句,例如:

INSERT INTO mytable(a,b,c)VALUES(?,?,?),(?,?,?),(?,?,?)

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

注意:这并不能保证表中存储的值是"安全"。 LOAD DATA语句是安全的。完全有可能通过其他一些语句提取该值,然后其他一些语句没有正确处理该值可能不安全,并造成破坏。


修改

我的回答是LOAD DATA语句不容易受SQL注入攻击,只要从文件中读取值即可。

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

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

(可能)容易受到注入攻击, $aa $a 包含在SQL文本中。