2010-12-23 2 views
4

パスワードに疑問符charが含まれていると、ユーザーのパスワードを変更する際に問題があります。私はこれまで他のcharとこの問題に遭遇していません、それは疑問符charに固有のようです。jdbcを使用してユーザーのパスワードを変更します。疑問符を含むパスの問題

私は次のSQL使用SQLPLUSでのユーザーのパスワードを変更する場合: Alter user Stephen identifed by "NewPassword?" REPLACE "OldPassword";

はその後、それが正常にパスを変更し、私は新しいパス使用してログインすることができます「NEWPASSWORDか」。

しかし私は、JDBC経由で同じSQLを実行している場合:私は、パスを使用してログインすることはできません
final String query = "ALTER user Stephen identified by \"NewPassword?\" REPLACE \"OldPassword\"";
stmt.executeUpdate(query);

「新パスワードを?」。

sqlplusとjdbcで入力したときのパスワードのハッシュコードが異なることを確認します。 何とかjdbcで文を実行すると、「NewPassword?」以外のものが入力されています。

私は以下のパスワードに問題がないようです: NewPassword、NewPassword \、NewPassword '。それは問題を引き起こす疑問符のようです。
デバッグでは、コードポイント(dec)が疑問符に対して63であるため、途中で変更されていないように見えます。

この動作の原因は何ですか? 私は現時点では紛失していますが、私はこの問題を回避するために疑問符でパスを防止することを検討しています。

+0

どのDBバージョンですか?どのJDBCドライバのバージョンですか? 'stmt.getClass()。getName()'とは何ですか? – BalusC

+0

申し訳ありませんが、私はこれを最初に述べておきました。 dbバージョン= Oracle Database 10g Express Editionリリース10.2.0.1.0 - Production、 ドライバのバージョン= 10.2.0.4.0、 stmt.getClass()。getName()= oracle_jdbc_driver_T4CStatement_Proxy –

答えて

5

  • 、(バインド・パラメータを使用することはできません)SQL文字列に直接無効にエスケープ処理をパスワードを入れて。

ユーザー名とパスワードがシングルクォート文字列としてデータベースに送信されないため、バインド変数を使用することはできません。

SQL文字列内の?は、バインド変数プレースホルダと見なされているため、SQL文字列はOracle JDBCによってある時点でマングルされています。ステートメントのエスケープ処理を無効にすると、これが実行されなくなります。試してみてください:

Statement s = conn.createStatement(); 
s.setEscapeProcessing(false); 
s.executeUpdate("ALTER user Stephen identified by \"newPassword?\" replace \"oldPassword\""); 

あなたがプログラムでパスワードを設定している場合は、あなたのコードは、SQLインジェクションを防ぐために、新旧のパスワードは任意の"文字が含まれていないことを確認する必要があります。

+0

ありがとうPourquoi。これはまさにそれがやっているように聞こえる。あなたのソリューションに試してみましょう:) –

+0

['PreparedStatement' javadoc](http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setEscapeProcessing%28boolean%29) : "注意:Prepared Statementオブジェクトのエスケープ処理を無効にしても、この呼び出しを行う前に準備済みの文が解析されています。" –

+0

@VitoShadow:ご意見ありがとうございます。質問者が使用しているように見えるので、私は答えを更新しました。ちなみに、私は質問者の問題をこれ以上再現することはできません。おそらく、その時点で使用していたバージョンよりも新しいバージョンのOracle JDBCドライバで修正されている可能性があります。 –

2

PreparedStatementを使用して実装してみて、同じ問題が発生するかどうかを確認してください。疑問符はプレースホルダとしてPreparedStatementsで使用されているため、JDBCドライバが混乱している可能性があります。 ではありませんが、確認する価値があります。

PreparedStatement p = conn.prepareStatement("ALTER user Stephen identified by ? replace ?"); 
p.setString(1, "NewPassword?"); 
p.setString(2, "OldPassword"); 
p.execute(); 

これは、おそらくドライバのバグです。あなたは2つのことを行う必要があるOracleユーザーのパスワードを変更するためにJDBCを使用するには

+1

プレースホルダを使用することはできません。ユーザーxはyで識別されますが、少なくともOracleでは認識されません。ユーザー名とパスワードは、一重引用符で囲まれた文字列としてデータベースに送信されません。 –

+0

ああ。これはおそらく動作しません。それでも、疑問符が誤って解釈されているという考え方は正しいかもしれません。 –

関連する問題