7

次のようなJDBCコードがあります。

String selectSQL = "SELECT * FROM DBUSER WHERE USER_ID = ? and PASSWORD = ?";

Integer userId = 1000;
char[] passwordString = new char[] { 't', 'e', 's', 't' };

PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL);
preparedStatement.setInt(1, 1001);
preparedStatement.setArray(2,... ??? // how to do this part?

// execute select SQL statement
ResultSet rs = preparedStatement.executeQuery();

preparedStatement.setArrayクエリで 2 番目のパラメーターを設定するにはどうすればよいですか? ここでは、パスワードを保護するために文字列パラメーターを使用したくありません。

注: Hypersonic DB を使用していますが、これが役立つ場合は MySql に移行する予定です。

4

4 に答える 4

9

PreparedStatement#setArrayがjava.sql.Arrayを受け取りました。 最初に、JDBC Conncetion のcreateArrayOfメソッドを使用して配列を作成する必要があります。その後でのみ、配列を に渡すことができますsetArray

このメソッドは受け入れるだけなので、charObject[]の代わりに配列を作成する必要があります。Character

例えば:

Character[] passwordString = new Character[] { 't', 'e', 's', 't' };
Array sqlArray = con.createArrayOf("CHAR", passwordString);
preparedStatement.setArray(2, sqlArray);
于 2012-12-20T13:30:42.813 に答える
3

準備されたステートメントで配列を渡したい場合は、呼び出すだけです

preparedStatemtn.setArray(index,array);

ただし、最初に保証する必要があるのは、DB では列もARRAYであることです。詳細については、Aviram Sagal の回答を参照してください。


しかし、あなたの基地はパスワードを保護するためにそれを考えました。

このソリューションは、Java 文字列プールからのパスワードの読み取りのみを保護します。とにかく、これは非常にレアなタイプの攻撃です。Ans パスワードはプレーン テキストとして送信されます。

私の提案は、db スキーマを複雑にする代わりに、暗号化のいくつかの利点を使用する必要があるということです。パスワード値を渡す代わりに、 password digestを渡す必要があります。

ダイジェスト機能の簡単な例。

public static String getDigest(byte[] password) {

  return new String(Hex.encodeHex(new MessageDigest.getInstance("SHA").digest(password)));

}

次に、安全なダイジェストを db に保存し、クエリで単純な文字列を使用します。

于 2012-12-20T13:55:57.880 に答える
1

このコードを見てください

final PreparedStatement statement = connection.prepareStatement(
        "SELECT my_column FROM my_table " + 
        "where search_column IN (SELECT * FROM unnest(?))"
);
final String[] values = getValues();
statement.setArray(1, connection.createArrayOf("text", values));
final ResultSet rs = statement.executeQuery();
try {
    while(rs.next()) {
        // do some...
    }
} finally {
    rs.close();
}

また、参照用にこの記事をご覧くださいhttp://people.apache.org/~djd/derby/publishedapi/java/sql/PreparedStatement.html

于 2012-12-20T13:30:02.040 に答える