2010-05-17 6 views
5

Comment pouvez-vous faire un insert batch en utilisant groovy Sql tout en simulant des instructions préparées? Tous les exemples que j'ai trouvés sont similaires aux suivants et n'utilisent pas d'instructions préparées.Insertion par lots utilisant groovy Sql?

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

Selon ce lien http://jira.codehaus.org/browse/GROOVY-3504 il n'y a pas moyen d'utiliser les instructions préparées directement à partir du lot. Quelle est la meilleure façon de simuler cela afin que je puisse éviter d'avoir à écrire mon propre code pour éviter l'injection SQL?

Répondre

0

Egalement lié est http://jira.codehaus.org/browse/GROOVY-4328.

De l'JIRA ci-dessus:

... mieux que nous pouvions (tout simplement) faire est convertir un tel GString à une chaîne normale. Pour cela, nous pourrions faire un peu plus que ce que nous faisons actuellement par l'analyse de la chaîne et essayer de citer ou échapper "chaîne" à la recherche de choses, mais pas nombre ou la date à la recherche de choses, mais il peut ne pas être très élégant. Normalement nous utiliserions le "?" caractère espaces réservés et une déclaration préparée et aurait beaucoup moins à faire

En termes de simulation des déclarations préparées, voir Java - escape string to prevent SQL injection

Cela dit, vous pouvez appliquer une heuristique de ce qui précède et décorer la withBatch méthode

16

Groovy 1.8.1 a introduit le support des instructions préparées avec traitement par lots. Exemple simple:

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

Voir aussi mon post sur le sujet: http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

+2

Merci pour le pourboire! Pour que cela fonctionne pour MySQL InnoDB, j'ai dû ajouter "sql.connection.autoCommit = false" avant le withBatch, et "sql.connection.commit()" pour le faire coller. – Andrew

+0

Comment allez-vous faire cela plusieurs colonnes? – AnujKu

0

OWASP ESAPI. Votre seule option lorsque les instructions préparées et les procédures stockées ne sont PAS une option, est d'échapper manuellement l'entrée de l'utilisateur.

ESAPI a des méthodes de travail prêtes pour la production.

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")) +"'"; 

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

Questions connexes