在我的应用程序中,我需要提供上传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加载数据一起转义?
答案 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文本中。