【问题标题】:Alter user password via jdbc. Problems with passes containing question marks通过 jdbc 更改用户密码。包含问号的通行证问题
【发布时间】:2011-05-29 22:14:39
【问题描述】:

当密码包含问号字符时,我在更改用户密码时遇到问题。到目前为止,我没有遇到任何其他字符的这个问题,它似乎是问号字符特有的。

如果我使用以下 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);

然后我无法使用通行证“NewPassword?”登录。

通过 sqlplus 和 jdbc 输入时检查密码的哈希码表明它们是不同的。 不知何故,当我在 jdbc 中运行该语句时,它输入的不是 'NewPassword?'。

我似乎对以下密码没有任何问题: 新密码,新密码\,新密码'。这似乎只是导致问题的问号。
调试显示问号的代码点 (dec) 为 63,因此它看起来不像中途更改。

有谁知道是什么导致了这种行为? 我现在很茫然,我正在考虑阻止带问号的通过来绕过这个问题。

【问题讨论】:

  • 哪个数据库版本?哪个 JDBC 驱动程序版本? stmt.getClass().getName() 说什么?
  • 对不起,我应该在一开始就提到这一点。 db version = Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production, driver version = 10.2.0.4.0, stmt.getClass().getName() = oracle_jdbc_driver_T4CStatement_Proxy

标签: java sql oracle jdbc


【解决方案1】:

尝试使用PreparedStatement 来实现它,看看是否会遇到同样的问题。问号在PreparedStatements 中用作占位符,因此可能是 JDBC 驱动程序感到困惑。它不应该,但可能值得检查。

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

如果这可行,那么它可能是驱动程序中的一个错误。

【讨论】:

  • 您不能在ALTER USER x IDENTIFIED BY y 中使用占位符,至少不能在Oracle 中使用。用户名和密码不会作为单引号字符串发送到数据库。
  • 啊。那时这可能行不通。尽管如此,问号被误解的想法可能仍然是正确的。
【解决方案2】:

要使用 JDBC 更改 Oracle 用户的密码,您需要做两件事:

  • 将密码直接放在SQL字符串中(不能使用绑定参数),
  • 禁用转义处理。

您不能使用绑定变量,因为用户名和密码不会作为单引号字符串发送到数据库。

SQL 字符串中的? 被用作绑定变量占位符,因此,Oracle JDBC 有时会破坏 SQL 字符串。禁用语句上的转义处理可以防止这种情况发生。试试:

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

如果您以编程方式设置密码,您的代码还应确保新密码和旧密码不包含任何 " 字符,以避免 SQL 注入。

【讨论】:

  • 感谢 Pourquoi。这听起来确实像它正在做的事情。我会试试你的解决方案:)
  • 来自PreparedStatement javadoc: "注意:由于准备好的语句通常在进行此调用之前已被解析,因此禁用对 PreparedStatements 对象的转义处理将无效"
  • @VitoShadow:感谢您的评论。我已经更新了我的答案以使用简单的Statement,因为这似乎是提问者正在使用的。顺便说一句,我无法再重现提问者的问题 - 也许它已在比我当时使用的更高版本的 Oracle JDBC 驱动程序中得到修复。
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
相关资源
最近更新 更多