Пакетная вставка с использованием 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?
4 ответа
В 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.8.1. Вы можете прочитать примечания к выпуску Groovy 1.8.1 для деталей. Просьба проверить документ API для помощи.
Также связана http://jira.codehaus.org/browse/GROOVY-4328.
Из вышесказанного JIRA:
... лучшее, что мы могли бы (просто) сделать, это преобразовать такую строку GString в обычную строку. Для этого мы могли бы сделать немного больше, чем в настоящее время, анализируя String и пытаясь заключать в кавычки или экранировать "выглядящие" строки, но не числа или числа, но не очень элегантно. Обычно мы будем использовать "?" заполнители символов и подготовленное заявление, и было бы гораздо меньше делать
С точки зрения симуляции подготовленных операторов, смотрите Java - escape-строку для предотвращения внедрения SQL
При этом, вы можете применить эвристику из вышеупомянутого и украсить withBatch
метод
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