2010-05-17 282 views
5

如何在模擬預處理語句時使用groovy Sql進行批量插入?我發現的所有示例都與以下內容類似,並且不使用預準備語句。使用groovy Sql進行批量插入?

withBatch { stmt -> 
stmt.addBatch("insert into table (field1,field2) values('value1','value2')") 
stmt.addBatch("insert into table (field1,field2) values('value3','value4')") 
} 

根據這個鏈接http://jira.codehaus.org/browse/GROOVY-3504沒有辦法直接從批次中使用準備好的語句。什麼是最好的方法來模擬這個,所以我可以避免寫我自己的代碼,以避免SQL注入?

回答

0

還相關的是http://jira.codehaus.org/browse/GROOVY-4328

從上面的JIRA:

...我們可能(只是)做的最好的是 轉換這樣一個GString的正常 字符串。爲此,我們可以做一點點 位比我們目前做更多 解析字符串和嘗試報價或 轉義「字符串」看東西,但不是 號碼或日期看東西,但它 可能不會很優雅。通常我們 會使用「?」性格 佔位符和一個準備好的聲明 和將有更不要

在模擬預處理語句方面,見Java - escape string to prevent SQL injection

話雖這麼說,你可以從上面的應用啓發式和裝飾withBatch方法

16

Groovy 1.8.1引入了對批處理語句的支持。簡單的例子:

sql.withBatch(20, """update some_table 
         set some_column = :newvalue 
         where id = :key """) { ps ->     
      mymap.each { k,v -> 
       ps.addBatch(key:k, newvalue:v) 
      } 
} 

也看到我的話題後:http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

+2

感謝您的提示!爲了讓MySQL InnoDB能夠正常工作,我必須在withBatch之前加上「sql.connection.autoCommit = false」,然後在「sql.connection.commit()」中加入以保持它。 – Andrew 2011-09-13 04:41:55

+0

你將如何做這個多列? – AnujKu 2015-04-02 21:05:50

0

OWASP ESAPI。 https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

您的唯一選擇是當預處理語句和存儲過程不是選項時,手動轉義用戶輸入。

ESAPI有工作,生產準備參考方法。

Codec ORACLE_CODEC = new OracleCodec(); 
String query = "SELECT user_id FROM user_data WHERE user_name = '" + 
    ESAPI.encoder().encodeForSQL(ORACLE_CODEC, req.getParameter("userID")) + "' and user_password = '" 
    + ESAPI.encoder().encodeForSQL(ORACLE_CODEC, req.getParameter("pwd")) +"'"; 

來源:https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Databas