0

Java:

PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)");
stmt.setString(1, a);
stmt.setString(2, b);
stmt.setString(3, c);
stmt.executeQuery();

保存されたルーチンがMySQLにある場合、フィルタリングされていない文字列がコードに何かを挿入することは可能ですか?

4

4 に答える 4

2

いいえ、PreparedStatementから保護するために構築されたようにSQL Injection

ストアドプロシージャを呼び出しているようですので、を使用することをお勧めしますCallableStatement

String SQL = "{CALL myStoredRoutine(?, ?, ?)}";
CallableStatement cstmt = myConnection.prepareCall(SQL);
  • プリペアドステートメント

PreparedStatementのインスタンスには、すでにコンパイルされているSQLステートメントが含まれています。これが「準備された」ステートメントを作成するものです

PreparedStatementオブジェクトはプリコンパイルされているため、Statementオブジェクトよりも高速に実行できます。

プリペアドステートメントは、SQLクエリを実行するために使用されます

  • 呼び出し可能なステートメント

CallableStatementオブジェクトは、すべてのRDBMSに対して標準的な方法でストアドプロシージャを呼び出す方法を提供します。ストアドプロシージャはデータベースに保存されます。ストアドプロシージャの呼び出しは、CallableStatementオブジェクトに含まれているものです。

于 2012-10-21T17:50:04.807 に答える
1

いいえ、できません。文字列、プリペアドステートメントによってフィルタリングされます。それが彼らのポイントの1つです。

于 2012-10-21T17:40:25.080 に答える
0

いいえ。パラメータバインディングの目的は、パラメータがパラメータとして解析されることです。それはパフォーマンスにも良いです。

于 2012-10-21T17:41:42.470 に答える
0

パラメータ化されたクエリを使用する場合、引数は解析され、必要に応じてエスケープ文字で変換されるため、不可能です。これは、パラメーター化されたクエリ/プリペアドステートメントを使用する利点です。

于 2012-10-21T17:42:08.830 に答える