2015-01-09 36 views
2

在我的應用程序,我需要提供上傳csv和excel文件,然後用於更新數據庫的可能性。該文件包含+/-幾百萬行,所以我需要使用裝載本地數據INFILE:如何保護加載數據本地infile更新查詢針對sql注入

$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的變量是由我的程序設定,所以他們不會是一個問題,但我我非常關心更新/插入值的安全性。有沒有什麼方法可以將本地負載數據與負載數據一起轉義而不會造成性能損失?

回答

4

如果我明白你在問什麼......沒有必要「逃避」由LOAD DATA聲明讀入的文件中的值。這些值被解釋爲數據,而不是作爲SQL文本的一部分。

也就是說,如果從文件讀入的值類似於NOW(),那將讀作字符串。如果該值被存儲到VARCHAR列中,則該字符串值將存儲在該列中;該字符串的內容不會被解釋爲「調用SQL函數」。

的LOAD DATA類似於與綁定佔位符,例如準備語句:

INSERT INTO MYTABLE(A,B,C)值,((,?,??)(,,????) ?,?,?)

爲佔位符提供的值僅作爲數據處理,它們不是SQL文本的一部分。

注意:這並不保證存儲在表中的值是「安全的」。 LOAD DATA語句是安全的。完全有可能通過其他一些陳述來提取該值,然後將其他一些陳述不正確地處理該值作爲潛在的不安全因素並造成嚴重破壞。


編輯

我回答說,LOAD DATA說法是不容易受到SQL注入,儘可能從文件中讀取值。

只是爲了澄清,則這部分代碼:

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

被(潛在地)容易受到注射,從$aa$a被包括在SQL文本。

+0

謝謝你的回答!這意味着我不需要擔心加載數據操作,但是之後的更新語句呢?如果我想進一步,我有一個沒有轉義的查詢字符串後,我的臨時表中的加載數據操作,然後運行更新查詢沒有這樣做正在準備(我沒有找到一種方式與$ stmt5這樣做),那麼在這個查詢中我沒有漏洞呢? – baao 2015-01-09 20:59:07

+0

如果'$ stmt5'中存在漏洞,則它位於'$ {prefix}'變量的內容中。由'UPDATE'語句處理的列的值僅處理數據。 (我唯一看到的其他潛能是UPDATE目標表上的易受攻擊的UPDATE觸發器的角落情況...觸發器必須編碼以準備和執行動態SQL(甚至在觸發器中允許)。 UPDATE語句本身不容易受到表中存儲的「不安全」值的影響 – spencer7593 2015-01-09 21:42:14

+0

好的,再次感謝!$前綴是由一個開關/白名單組成的,以避免此處的漏洞。 – baao 2015-01-09 21:45:55