如何在模拟预准备语句时使用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 :(得分: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
答案 1 :(得分:1)
同样相关的是http://jira.codehaus.org/browse/GROOVY-4328。
来自上述JIRA:
......我们能做的最好的事情就是 将这样的GString转换为正常值 串。为此,我们可以做一点 比我们目前所做的更多 解析String并尝试引用或 逃避“字符串”看事情但不是 数字或日期看东西,但它 可能不是很优雅。通常我们 会用“?”字符 占位符和准备好的声明 并且会做更少的事情
在模拟准备好的陈述方面,请参阅Java - escape string to prevent SQL injection
话虽如此,您可以应用上面的启发式并装饰withBatch
方法
答案 2 :(得分:1)
版本1.8.1支持它。您可以阅读Groovy 1.8.1 release notes了解详情。 请检查API Document寻求帮助。
答案 3 :(得分: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