7

在模拟准备好的语句时,如何使用 groovy Sql 进行批量插入?我发现的所有示例都类似于以下示例,并且不使用准备好的语句。

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

根据此链接https://issues.apache.org/jira/browse/GROOVY-3504,无法直接从批处理中使用准备好的语句。模拟这种情况的最佳方法是什么,这样我就可以避免编写自己的代码来避免 sql 注入?

4

4 回答 4

20

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

于 2011-09-01T05:22:22.137 回答
1

从版本 1.8.1 开始支持它。有关详细信息,您可以阅读Groovy 1.8.1 发行说明。请查看API 文档以获取帮助。

于 2013-02-08T02:43:36.610 回答
1

同样相关的是https://issues.apache.org/jira/browse/GROOVY-4328

从上面的JIRA:

...我们能(简单地)做的最好的事情就是将这样的 GString 转换为普通的 String。为此,我们可以通过解析字符串并尝试引用或转义“字符串”外观而不是数字或日期外观的东西,但它可能不是很优雅。通常我们会使用“?” 字符占位符和准备好的语句,并且要做的事情要少得多

模拟prepared statements方面,见Java-escape string to prevent SQL injection

话虽如此,您可以应用上面的启发式方法并装饰withBatch方法

于 2010-12-03T01:42:15.823 回答
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

于 2011-12-15T14:52:00.430 回答