2010-05-17 4 views
5

준비된 명령문을 시뮬레이트하는 동안 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 주입을 피하기 위해 자체 코드를 작성하지 않아도됩니까?

답변

0

관련 항목은 http://jira.codehaus.org/browse/GROOVY-4328입니다. 위의 JIRA에서

:

... 우리는 (단순히) 할 수있는 최선은 이 정상 String으로 이러한 G 스트링으로 변환된다. 이를 위해 비트를 수행 할 수 있습니다. 문자열을 파싱하고 탈출 "문자열"을 보려고 시도하지만 숫자는 아니지만 숫자 또는 날짜는 보이는 것이지만 은 그리 우아하지 않을 수 있습니다. 일반적으로 은 "?" 자리의 문자와 준비된 문 하고, 시뮬레이션 준비된 명령문의 측면에서

을 훨씬 덜이 Java - escape string to prevent SQL injection 말했다되고 그건

, 당신은 위의 휴리스틱을 적용 할 수 확인하고 withBatch을 장식하는 것 방법

16

Groovy 1.8.1에서는 일괄 처리가있는 준비된 명령문에 대한 지원이 도입되었습니다. 간단한 예 : http://novyden.blogspot.com/2011/09/groovy-batch-prepared-statement-nice.html

+2

팁 주셔서 감사합니다! 이 기능을 MySQL InnoDB에서 사용하려면 withBatch 앞에 "sql.connection.autoCommit = false"를 추가하고 "sql.connection.commit()"을 붙여서 붙여야했습니다. – Andrew

+0

여러 열을 어떻게 처리 하시겠습니까? – AnujKu

0

OWASP ESAPI :

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

또한 주제에 내 게시물을 참조하십시오. https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

준비된 명령문 및 저장된 procs가 선택 사항이 아닌 유일한 옵션은 수동으로 사용자 입력을 피하는 것입니다.

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

관련 문제