如何针对 sql 注入保护加载数据本地文件更新查询
how to secure load data local infile update query against sql injection
在我的应用程序中,我需要提供上传 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 中的变量由我的程序设置,因此不会有问题,但我非常担心 updated/inserted 值的安全性。有什么方法可以在不损失性能的情况下将这些值与加载数据本地 infile 一起转义吗?
如果我明白你在问什么...没有必要 "escape" LOAD DATA
语句读入的文件中的值。这些值被解释为数据,而不是 SQL 文本的一部分。
也就是说,如果从文件中读入的值类似于 NOW()
,它将作为字符串读取。如果将其存储到 VARCHAR 列中,则该字符串值将存储在该列中;该字符串的内容不会被解释为 "call a SQL function".
加载数据类似于带有绑定占位符的准备语句,例如:
插入我的table (a,b,c) 值 (?,?,?), (?,?,?), (?,?,?)
为占位符提供的值仅作为数据处理,它们不是 SQL 文本的一部分。
注意:这不能保证 table 中存储的值是 "safe"。 LOAD DATA 语句是安全的。该值完全有可能被其他语句提取,然后其他语句未正确处理该值可能不安全,并造成严重破坏。
编辑
我的回答是,就从文件中读取的值而言,LOAD DATA
语句不容易受到 SQL 注入攻击。
澄清一下,这部分代码:
$stmt4 = $dbh->prepare("LOAD DATA LOCAL INFILE '/ama/$aa[0]/CustomerUpload/$a.csv' INTO
(可能)容易受到注入攻击,从 $aa
和 $a
被包含在 SQL文本。
在我的应用程序中,我需要提供上传 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 中的变量由我的程序设置,因此不会有问题,但我非常担心 updated/inserted 值的安全性。有什么方法可以在不损失性能的情况下将这些值与加载数据本地 infile 一起转义吗?
如果我明白你在问什么...没有必要 "escape" LOAD DATA
语句读入的文件中的值。这些值被解释为数据,而不是 SQL 文本的一部分。
也就是说,如果从文件中读入的值类似于 NOW()
,它将作为字符串读取。如果将其存储到 VARCHAR 列中,则该字符串值将存储在该列中;该字符串的内容不会被解释为 "call a SQL function".
加载数据类似于带有绑定占位符的准备语句,例如:
插入我的table (a,b,c) 值 (?,?,?), (?,?,?), (?,?,?)
为占位符提供的值仅作为数据处理,它们不是 SQL 文本的一部分。
注意:这不能保证 table 中存储的值是 "safe"。 LOAD DATA 语句是安全的。该值完全有可能被其他语句提取,然后其他语句未正确处理该值可能不安全,并造成严重破坏。
编辑
我的回答是,就从文件中读取的值而言,LOAD DATA
语句不容易受到 SQL 注入攻击。
澄清一下,这部分代码:
$stmt4 = $dbh->prepare("LOAD DATA LOCAL INFILE '/ama/$aa[0]/CustomerUpload/$a.csv' INTO
(可能)容易受到注入攻击,从 $aa
和 $a
被包含在 SQL文本。