Пакетная вставка с использованием Groovy Sql? - PullRequest
7 голосов
/ 17 мая 2010

Как сделать пакетную вставку с использованием 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 ]

20 голосов
/ 01 сентября 2011

В 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 голос
/ 08 февраля 2013

Поддерживается с версии 1.8.1. Вы можете прочитать примечания к выпуску Groovy 1.8.1 для подробностей. Просьба проверить API-документ за помощью.

1 голос
/ 03 декабря 2010

Также относится http://jira.codehaus.org/browse/GROOVY-4328.

Из вышеперечисленного JIRA:

... лучшее, что мы могли (просто) сделать, это преобразовать такой GString в нормальный Строка. Для этого мы могли бы сделать немного немного больше, чем мы делаем сейчас парсинг строки и попытаться процитировать или избежать "строки", глядя вещи, но не число или дата смотреть вещи, но это может быть не очень элегантно Обычно мы будет использовать "?" персонаж заполнители и подготовленное заявление и было бы гораздо меньше сделать

Что касается моделирования подготовленных операторов, см. Java - escape-строка для предотвращения внедрения SQL

При этом вы можете применить эвристику из вышеприведенного и украсить withBatch метод

0 голосов
/ 15 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...