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

chr*_*con 3 mysql security pdo sql-injection load-data-infile

在我的应用程序中,我需要提供上传 csv 和 excel 文件的可能性,然后将这些文件用于更新数据库。这些文件包含+/-几百万行,所以我需要使用加载本地数据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");
Run Code Online (Sandbox Code Playgroud)

$stmt4 中的变量是由我的程序设置的,因此它们不会成为问题,但我非常担心更新/插入值的安全性。有没有什么方法可以在不损失性能的情况下将这些值与加载数据本地文件一起转义?

spe*_*593 5

如果我明白你在问什么......没有必要“转义”语句读取的文件中的值LOAD DATA。这些值被解释为数据,而不是 SQL 文本的一部分。

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

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

插入 mytable (a,b,c) 值 (?,?,?), (?,?,?), (?,?,?)

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

注意:这并不能保证表中存储的值是“安全的”。LOAD DATA 语句是安全的。该值完全有可能被其他语句提取,然后其他语句无法正确处理该值,因为该值可能不安全,并造成严重破坏。


编辑

我的回答是,LOAD DATA就从文件中读取的值而言,该语句不易受到 SQL 注入的攻击。

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

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

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