2010-05-17 13 views
5

Come si può eseguire un inserimento batch utilizzando Groovy Sql durante la simulazione di istruzioni preparate? Tutti gli esempi che ho trovato sono simili ai seguenti e non usano istruzioni preparate.Inserto batch usando groovy Sql?

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

Secondo questo link http://jira.codehaus.org/browse/GROOVY-3504 non c'è modo di utilizzare le istruzioni preparate direttamente da batch. Qual è il modo migliore per simulare questo in modo da evitare di dover scrivere il mio codice per evitare l'iniezione sql?

risposta

0

Anche correlato è http://jira.codehaus.org/browse/GROOVY-4328.

Dal JIRA di cui sopra:

... il meglio che potevamo (semplicemente) fare è convertire tale GString ad un normale String. Per fare questo potremmo fare un po 'di bit di parsing dello String e provare a quotare o escape "string" cercando cose ma non numero o data che sembrano cose ma è potrebbe non essere molto elegante. Normalmente noi useremmo il "?" carattere segnaposto e una dichiarazione preparata e avrebbero molto meno a che fare

In termini di simulazione di istruzioni preparate, vedi Java - escape string to prevent SQL injection

Detto questo, si potrebbe applicare un'euristica da quanto sopra e decorare la withBatch metodo

16

Groovy 1.8.1 ha introdotto il supporto per le istruzioni preparate con il batching. Esempio semplice:

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

veda anche il mio post sul tema: http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

+2

Grazie per il suggerimento! Per far funzionare questo per MySQL InnoDB, ho dovuto aggiungere "sql.connection.autoCommit = false" prima di withBatch e "sql.connection.commit()" per renderlo attivo. – Andrew

+0

Come farete queste colonne multiple? – AnujKu

0

Owasp ESAPI. https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

L'unica opzione quando le istruzioni preparate e le stored proc non sono un'opzione, è quella di sfuggire manualmente all'input dell'utente.

ESAPI dispone di metodi di riferimento pronti per la produzione.

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

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