Изменить пароль пользователя через jdbc. Проблемы с пропусками, содержащими вопросительные знаки - PullRequest
4 голосов
/ 23 декабря 2010

У меня проблема с изменением пароля пользователя, когда пароль содержит знак вопроса char.До сих пор я не сталкивался с этой проблемой ни с каким другим символом, он кажется специфичным для вопросительного знака char.

Если я изменяю пароль пользователя в sqlplus, используя следующий sql:
Alter user Stephen identifed by "NewPassword?" REPLACE "OldPassword";
Затем он успешно меняет проход, и я могу войти в систему, используя новый пароль 'NewPassword?'.

Однако, если я выполню тот же SQL через jdbc:
final String query = "ALTER user Stephen identified by \"NewPassword?\" REPLACE \"OldPassword\"";<br> stmt.executeUpdate(query);
, я не смогу войти в систему, используяпроход 'NewPassword?'.

Проверка хэш-кодов для пароля при вводе через sqlplus и jdbc показывает, что они разные.Каким-то образом, когда я запускаю оператор в jdbc, он вводит что-то отличное от «NewPassword?».

Кажется, у меня нет проблем со следующими паролями: NewPassword, NewPassword \, NewPassword '.Кажется, это просто вопросительный знак, вызывающий проблемы.
Отладка показывает, что для вопросительного знака точка кода (dec) равна 63, так что это не похоже на то, что его изменяют на полпути.

Кто-нибудьесть идеи, что может быть причиной такого поведения?В данный момент я в растерянности, я рассматриваю возможность предотвращения проходов с вопросительными знаками, чтобы пока обойти эту проблему.

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Чтобы использовать JDBC для изменения пароля пользователя Oracle, вам нужно сделать две вещи:

  • поместить пароль непосредственно в строку SQL (параметры связывания использовать нельзя),
  • отключить escape-обработку.

Нельзя использовать переменные связывания, поскольку имя пользователя и пароль не отправляются в базу данных в виде строк в одинарных кавычках.

? inстрока SQL берется в качестве заполнителя переменной связывания, и поэтому в какой-то момент строка SQL искажается Oracle JDBC.Отключение escape-обработки в операторе останавливает это.Попробуйте:

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

Если вы устанавливаете пароль программно, ваш код должен также гарантировать, что новый и старый пароли не содержат символов ", чтобы избежать внедрения SQL.

2 голосов
/ 23 декабря 2010

Попробуйте реализовать его с помощью PreparedStatement и посмотрите, не возникнет ли та же проблема.Вопросительные знаки используются в PreparedStatements в качестве заполнителей, поэтому, возможно, драйвер JDBC запутывается.Это не должно , но, возможно, стоит проверить.

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

Если это работает, вероятно, это ошибка в драйвере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...