7

準備されたステートメントをシミュレートしながら、groovy Sql を使用してバッチ挿入を行うにはどうすればよいですか? 私が見つけたすべての例は次のようなもので、準備済みステートメントを使用していません。

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

このリンクhttps://issues.apache.org/jira/browse/GROOVY-3504によると、準備されたステートメントをバッチ内から直接使用する方法はありません。これをシミュレートして、SQL インジェクションを回避するために独自のコードを作成する必要がないようにする最善の方法は何ですか?

4

4 に答える 4

20

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

于 2011-09-01T05:22:22.137 に答える
1

https://issues.apache.org/jira/browse/GROOVY-4328も関連しています。

上記のJIRAから:

... (単純に) できる最善の方法は、そのような GString を通常の String に変換することです。そのために、文字列を解析し、「文字列」のように見えるものを引用またはエスケープしようとすることで、現在よりも少し多くのことを行うことができますが、数字や日付のように見えるものはそうではありませんが、あまりエレガントではないかもしれません. 通常、「?」を使用します。文字のプレースホルダーと準備されたステートメントであり、行うことははるかに少なくなります

プリペアド ステートメントのシミュレートに関しては、Java - SQL インジェクションを防止するためのエスケープ文字列を参照してください。

そうは言っても、上記のヒューリスティックを適用してwithBatchメソッドを装飾することができます

于 2010-12-03T01:42:15.823 に答える
1

バージョン 1.8.1 から対応しています。詳細については、Groovy 1.8.1 のリリース ノートを参照してください。ヘルプについては、 API ドキュメントを確認してください。

于 2013-02-08T02:43:36.610 に答える
0

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

于 2011-12-15T14:52:00.430 に答える