Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何针对sql注入保护加载数据本地填充更新查询_Mysql_Security_Pdo_Sql Injection_Load Data Infile - Fatal编程技术网

Mysql 如何针对sql注入保护加载数据本地填充更新查询

Mysql 如何针对sql注入保护加载数据本地填充更新查询,mysql,security,pdo,sql-injection,load-data-infile,Mysql,Security,Pdo,Sql Injection,Load Data Infile,在我的应用程序中,我需要提供上传csv和excel文件的可能性,然后使用这些文件更新数据库。文件包含+/-数百万行,因此我需要使用加载本地数据填充: $stmt1 = $dbh->prepare("CREATE TEMPORARY TABLE ${prefix}tempskuEAN LIKE ${prefix}skuEAN"); $stmt4 = $dbh->prepare("LOAD DATA LOCAL INFILE '/ama/$aa[0]/CustomerUpload/$a

在我的应用程序中,我需要提供上传csv和excel文件的可能性,然后使用这些文件更新数据库。文件包含+/-数百万行,因此我需要使用加载本地数据填充:

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

如果我理解您的要求。。。不需要转义LOAD DATA语句读入的文件中的值。这些值被解释为数据,而不是SQL文本的一部分

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

加载数据类似于带有绑定占位符的准备语句,例如:

在mytable a、b、c中插入值?、?、?、?、?、?、?、?、?、?、?、?、

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

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

编辑

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

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

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

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

谢谢您的回答!这意味着我不需要关心load data操作,但接下来的update语句呢?如果我再进一步想一想,在我的临时表中的load data op之后,我有一个未转义的查询字符串,然后在没有准备的情况下运行一个更新查询,并且我找不到使用$stmt5的方法,那么我的查询中不存在漏洞吗?如果$stmt5中存在漏洞,则它位于${prefix}变量的内容中。UPDATE语句处理的列中的值仅处理数据。我看到的唯一其他可能的情况是,在更新的目标表上有一个易受攻击的更新触发器。。。触发器必须进行编码以准备和执行动态SQL,这在触发器中是否允许?。。UPDATE语句本身不易受到表中存储的不安全值的攻击。好的,再次感谢!$prefix由一个开关/白名单组成,以避免此处的漏洞。