mysql - 如何保护加载数据本地 infile 更新查询以防止 sql 注入(inject)

标签 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");

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

最佳答案

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

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

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

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

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

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


编辑

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

澄清一下,这部分代码:

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

(可能)容易受到注入(inject)攻击,因为 $aa$a 被包含在 SQL 文本中.

关于mysql - 如何保护加载数据本地 infile 更新查询以防止 sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868732/

相关文章:

php - android 应用程序与 web 服务通信的安全性

PHP comet usleep 阻塞 apache mpm?

php - PDOStatement : Invalid parameter number 中的警告

php - 如何在 PHP 脚本中正确地将元素与 SQL 表隔离

mysql - 如何优化必须使用连接表获取最后 5 行的查询

security -/var/lib/kubelet/pods下的目录权限

php - 将函数更改为 PDO

Java MySQL 连接服务器

mysql - 通过他的名字更改列引用 ID 保持 NULL 值

java - 是否可以阻止 JVM 访问特定的 URL?